我有一个大型数据集,如下所示:
with open('filename')as file:
我想使它看起来像:
ID224912 A A A B B A B A B A B
我尝试修改在其他地方找到但没有成功的代码:
ID224912 AA AB BA BA BA BA
有什么建议吗?
答案 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 '{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行
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