Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
格式化文本文件linux_Linux_Awk - Fatal编程技术网

格式化文本文件linux

格式化文本文件linux,linux,awk,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

我有一个表格文件。我想在第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   
输出文件:

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

因此,如果第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
这实际上是您当前代码的“惯用语”(如果这个词存在: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*$/'文件

因此,如果第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
这实际上是您当前代码的“惯用语”(如果这个词存在: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*$/'文件
这里是一个
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。

这里是一个
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。

给出输入和输出示例。空行是否已经是输入文件的一部分?如果是这样,跳过空行就足够了。输入中的行如何“匹配”?我更新了问题…我的版本保留了行末尾的空白。它没有移动到下一行。如果您希望删除它们,请参阅我使用
$1=$1
更新的帖子,为我们提供输入和输出示例。空行是否已经是输入文件的一部分?如果是这样,跳过空行就足够了。输入中的行如何“匹配”?我更新了问题…我的版本保留了行末尾的空白。它没有移动到下一行。如果您希望删除它们,请参阅我的更新文章,使用
$1=$1
代码仍然在空行中添加3个空格。当我转到编辑器中的空白行时,光标移动3次,然后移动到下一个块。这可能是因为原始输入包含一些尾随空格。澄清这是否是所需的输出。原始输入没有任何尾随空格。所需的输出是块之间只有一个空格的空行。是的,检查修订号3并查看空格:是的,你是对的。输入在每行末尾都有空格。如何一次性删除所有尾随空格?代码仍在空行中添加3个空格。当我转到编辑器中的空白行时,光标移动3次,然后移动到下一个块。这可能是因为原始输入包含一些尾随空格。澄清这是否是所需的输出。原始输入没有任何尾随空格。所需的输出是块之间只有一个空格的空行。是的,检查修订号3并查看空格:是的,你是对的。输入在每行末尾都有空格。如何一次性删除所有尾随空格?