删除每隔一列之间的空格

时间:2018-10-22 02:04:51

标签: bash awk sed

我有一个大型数据集,如下所示:

with open('filename')as file:

我想使它看起来像:

ID224912 A A A B B A B A B A B

我尝试修改在其他地方找到但没有成功的代码:

ID224912 AA AB BA BA BA BA

有什么建议吗?

6 个答案:

答案 0 :(得分:1)

这可能对您有用(GNU sed):

sed -E 's/((\S+\s\S+\s)*\S+).*/\1/g;s/(\S+\s\S+)\s/\1/g' file

解决方案分为两部分。首先将字段之间的间隔分组为偶数,如果有一个,则删除多余的字段。然后将字段分组

答案 1 :(得分:0)

  • 您不必将AWK脚本分配给变量。只需内联调用它,这更简单,更安全。
  • 您对前四个字段进行分组看起来很奇怪。据我从您期望的输出中看到的,仅将第一个(ID)字段分开对待就足够了。

尝试类似的东西:

awk '{printf("%s", $1); for (i=2; i<=NF; i+=2) printf(" %s%s", $i, $(i+1)); print ""}' InFile > OutFile

希望这个帮助。

答案 2 :(得分:0)

$ awk '{r=$1; for (i=2; i<NF; i+=2) r=r OFS $i $(i+1); print r}' file
ID224912 AA AB BA BA BA

答案 3 :(得分:0)

对于娱乐,这里是一种sed解决方案:

cat input | sed 's/\([ A-Z ]\) \([ A-Z ]\)/\1\2/g' > output

为澄清起见,我在BSD sed上进行了测试。

答案 4 :(得分:0)

关于 InFile 作为输入文件,您可以通过以下方式使用sed:

cat InFile |sed -e 's/\([a-zA-Z]\)[ \t]\([a-zA-Z]\)/\1\2/g'

N.B .:在最初的问题中使用指定的InFile(字母的奇数),结果是:

ID224912 AA AB BA BA BA B

答案 5 :(得分:0)

以下

awk '{printf $1}{for(i=2;i<=NF;i+=2) printf OFS $i $(i+1); print "" }'

将输出

ID224912 AA AB BA BA BA B

您注意到,由于原始输出中的列数均匀,因此最后有一个额外的列B。由于OP不想这样做,我们可以通过for循环条件中的简单更新来解决此问题

awk '{printf $1}{for(i=2;i<NF;i+=2) printf OFS $i $(i+1); print "" }'

将输出

ID224912 AA AB BA BA BA