我有一个大文件,格式如下:
#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
等等
我希望在Linux中使用命令可以做的是找到以“#pair:”开头的每一行,并将最后3列直接移到这一行。例如:
#pair: 1 2 1 2 0 0 1
更改为:
#pair: 1 2 1 2
0 0 1
非常感谢你!
答案 0 :(得分:1)
使用Awk很容易:
awk '/^#pair:/ { $6 = "\n" $6 }1' file >newfile
这假设字段计数是常量,并且#pair:
行末尾的空格是可以容忍的。这两个假设都很容易修复或解决,但代价是代码可读性。 (如果字段数可以更改,请使用类似$(NF-2)
而不是$6
的内容,但是您始终需要最后三个。如果需要,请添加一个简单的sub()
来修剪空格。)
正则表达式匹配以#pair:
开头的行,并且操作表示在第六个字段之前添加换行符。
单独的1
是一个将每个输入行打印到标准输出的awk习语。
这会读取file
并将输出放在newfile
。