格式化文本文件linux
我有一个表格文件。我想在第4列的匹配后添加空格 输入文件:格式化文本文件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
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
,计算结果为True并触发1
默认行为:打印当前行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
,计算结果为True并触发1
默认行为:打印当前行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并查看空格:是的,你是对的。输入在每行末尾都有空格。如何一次性删除所有尾随空格?