删除每隔一列之间的空格



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

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

我想让它看起来像:

ID224912 AA AB BA BA BA BA

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

AWK=''' { printf (""%s %s %s %s"", $1, $2, $3, $4); } 
{ for (f = 5; f <= NF; f += 2) printf (""%s %s"", $(f), $(f + 1)); } 
{ printf (""n""); } ''' 
awk ""${AWK}"" InFile > OutFile

有什么建议吗?

这可能对你有用(GNU sed(:

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

解决方案分为两部分。首先将字段之间的空格分组为偶数,如果存在,则删除额外的字段。然后对字段进行分组

$ 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
  • 您不必将 AWK 脚本分配给变量。只需内联调用它,这更简单、更安全。
  • 您对前四个字段进行分组看起来很奇怪。据我从您想要的输出中看到,只需单独处理第一个 (ID( 字段就足够了。

尝试类似操作:

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

希望这个嘶嘶。

对于乐趣,这里有一个sed解决方案:

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

只是为了澄清,我在BSD sed上进行了测试。

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

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

注意:在您的初始问题中使用指定的 InFile(字母数为奇数(,结果为:

ID224912 AA AB BA BA BA B

以下尴尬行

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

最新更新