格式化文本文件linux

时间:2015-02-12 15:29:38

标签: linux awk

我有一个表格文件。我希望在第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

2 个答案:

答案 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。

相关问题