我有一个大型数据集,如下所示:
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