我有一个表格文件。我希望在第4列的匹配后添加空格。
输入文件:
seq1 5 15 ID1
seq1 20 34 ID1
seq1 50 48 ID2
seq1 45 36 ID2
seq1 55 75 ID3
seq1 80 84 ID3
seq2 17 20 ID5
seq2 30 48 ID7
seq2 55 66 ID7
seq3 27 40 ID9
输出文件:
seq1 5 15 ID1
seq1 20 34 ID1
seq1 50 48 ID2
seq1 45 36 ID2
seq1 55 75 ID3
seq1 80 84 ID3
seq2 17 20 ID5
seq2 30 48 ID7
seq2 55 66 ID7
seq3 27 40 ID9
我尝试过使用不同的awk
oneliners,但在空白行中以3个空格结束。我想在块之间只留一个空格。
这是我的代码:
awk '{if(NR > 1 && $4 != prev_rec){printf "\n";} prev_rec=$4; print $0}' File
答案 0 :(得分:2)
因此,如果第4个字段发生变化,您需要打印一个额外的行:
$ awk 'NR>1 && $4!=stored {print""} {stored=$4}1' a
seq1 5 15 ID1
seq1 20 34 ID1
seq1 50 48 ID2
seq1 45 36 ID2
seq1 55 75 ID3
seq1 80 84 ID3
seq2 17 20 ID5
seq2 30 48 ID7
seq2 55 66 ID7
seq3 27 40 ID9
这实际上是一个" idiomatication" (如果这个词存在:D)您当前的代码,顺便说一句,对我来说很好:
{ }
。if (NR > 1 && $4 != prev_rec) {}
也可以写为NR>1 && $4 != prev_rec {}
。{printf "\n";}
可以写成{print ""}
。print $0
可以压缩为print
甚至1
,其评估为True并触发awk
默认行为:打印当前行。最后,注意我认为是干净的输入,而你的有一些尾随空格。要清除它,您可以使用此sed:sed -i 's/\s*$//' file
。
答案 1 :(得分:2)
这是awk
awk '{print $0($4!=f?"":RS)} {f=$4}' file
seq1 5 15 ID1
seq1 20 34 ID1
seq1 50 48 ID2
seq1 45 36 ID2
seq1 55 75 ID3
seq1 80 84 ID3
seq2 17 20 ID5
seq2 30 48 ID7
seq2 55 66 ID7
seq3 27 40 ID9
如果上一个字段从上一行更改,则添加一个新行。
如果您想在行尾删除空白,请使用:
awk '{$1=$1;print $0($4!=f?"":RS)} {f=$4}' file
$1=$1
重新创建该行并删除所有尾随空格,并在每个字段之间使用默认FS。