我有一个巨大的文件,其格式如下:
#pair: 0 1 0 1 0 0 1
0 0 1
0 0 1
0 0 1
0 0 1
0 0 1
0 0 1
0 0 1
0 0 1
0 0 1
0 0 1
0 0 1
0 0 1
0 0 1
0 0 1
0 0 1
0 0 1
0 0 1
0 0 1
0 0 1
0 0 1
0 0 1
0 0 1
0 0 1
0 0 1
0 0 1
0 0 1
0 0 1
0 0 1
0 0 1
0 0 1
0 0 1
#pair: 1 2 0 1 1 0 0
1 0 0
1 0 0
1 0 0
1 0 0
1 0 0
1 0 0
1 0 0
1 0 0
1 0 0
1 0 0
1 0 0
1 0 0
1 0 0
1 0 0
1 0 0
1 0 0
1 0 0
1 0 0
1 0 0
1 0 0
1 0 0
1 0 0
1 0 0
1 0 0
1 0 0
1 0 0
1 0 0
1 0 0
1 0 0
1 0 0
1 0 0
#pair: 1 2 1 2 0 0 1
我想找到以“#pair:”开头的每一行,并将最后 3 列直接移动到该行下方。例如:
#pair: 1 2 1 2 0 0 1
更改为:
#pair: 1 2 1 2
0 0 1
我如何使用在 Linux 中运行的命令来做到这一点?
答案1
使用 awk 有点冗长:
awk '
$1=="#pair:" {
sep=""
for (i=1; i<NF-2; i++) {
printf "%s%s", sep, $i
sep="\t"
}
print ""
printf "%s\t%s\t%s\n", $(NF-2), $(NF-1), $NF
next
}
1
' <<END
#pair: 0 1 2 3 4 5 6
0 0 1
#pair: 0 1 2 31 4 5 6
0 0 1
END
#pair: 0 1 2 3
4 5 6
0 0 1
#pair: 0 1 2 31
4 5 6
0 0 1
答案2
你可以告诉sed
这样做:
sed '/^#/ s/'$'\t''\([0-9]'$'\t''[0-9]'$'\t''[0-9]\)$/\n\1/'
^ ^ ^ ^ ^ ^
| | | | | |
| replace| digit | What was remembered
line starts tab | in the 1st \(...\)
with a # newline