格式化文本文件 linux
Format text file linux
我有一个表格文件。我想在第 4 列匹配后添加空白 space。
输入文件:
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
单行,但在空白行中以 3 space 结尾。我只想要一个 space 块之间的空行。
这是我的代码:
awk '{if(NR > 1 && != prev_rec){printf "\n";} prev_rec=; print [=13=]}' File
因此,如果第 4 个字段发生变化,您需要多打印一行:
$ awk 'NR>1 && !=stored {print""} {stored=}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 && != prev_rec) {}
也可以写成NR>1 && != prev_rec {}
.
{printf "\n";}
可以写成{print ""}
.
print [=16=]
可以压缩为 print
甚至 1
,其计算结果为 True 并触发 awk
默认行为:打印当前行。
最后,请注意,我认为输入是干净的,而你的输入有一些尾随空格。要清理它,您可以使用此 sed:sed -i 's/\s*$//' file
.
这是一个awk
awk '{print [=10=](!=f?"":RS)} {f=}' 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 '{=;print [=11=](!=f?"":RS)} {f=}' file
=
重新创建行并删除所有尾随空格并在每个字段之间使用默认 FS。
我有一个表格文件。我想在第 4 列匹配后添加空白 space。
输入文件:
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
单行,但在空白行中以 3 space 结尾。我只想要一个 space 块之间的空行。
这是我的代码:
awk '{if(NR > 1 && != prev_rec){printf "\n";} prev_rec=; print [=13=]}' File
因此,如果第 4 个字段发生变化,您需要多打印一行:
$ awk 'NR>1 && !=stored {print""} {stored=}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 && != prev_rec) {}
也可以写成NR>1 && != prev_rec {}
.{printf "\n";}
可以写成{print ""}
.print [=16=]
可以压缩为print
甚至1
,其计算结果为 True 并触发awk
默认行为:打印当前行。
最后,请注意,我认为输入是干净的,而你的输入有一些尾随空格。要清理它,您可以使用此 sed:sed -i 's/\s*$//' file
.
这是一个awk
awk '{print [=10=](!=f?"":RS)} {f=}' 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 '{=;print [=11=](!=f?"":RS)} {f=}' file
=
重新创建行并删除所有尾随空格并在每个字段之间使用默认 FS。