我一直在尝试想出一个sed命令,该命令将从文件中用空行分隔的文本块中提取某些行。文本块如下。
# cat test_file.txt
line 1
line 2
line 3
line 4
line 5
line 1
line 2
line 3
line 4
line 5
line 1
line 2
line 3
line 4
line 5
我试图从每个块中拉出第2行和第4行,这样输出将如下所示。
line 2
line 4
line 2
line 4
line 2
line 4
我想出了一种方法来使用sed对第一块文本进行处理:
# sed -n -e 2p -e 4p test_flie.txt
line 2
line 4
但一直没能找到一种方法,让它对每个文本块都继续,直到文件结束。任何建议都将不胜感激。
awks段落模式专门用于处理空行分隔的记录/文本块,就像您正在处理的那样:
$ awk 'BEGIN{RS=""; ORS="nn"; FS=OFS="n"} {print $2, $4}' file
line 2
line 4
line 2
line 4
line 2
line 4
参考POSIX标准:
如果RS为空,则记录由一个
<newline>
加上一个或多个空行组成的序列分隔,前导或尾随空行不应导致输入的开头或结尾出现空记录
如果您不需要在最终记录后打印空行:
$ awk 'BEGIN{RS=""; FS=OFS="n"} NR>1{print prev ORS} {prev=$2 OFS $4} END{print prev}' file
line 2
line 4
line 2
line 4
line 2
line 4
或者如果你出于某种原因不想使用段落模式,那么:
$ awk 'BEGIN{tgts[2]; tgts[4]} !NF{print ""; lineNr=0; next} ++lineNr in tgts' file
line 2
line 4
line 2
line 4
line 2
line 4
我会使用awk,例如:
awk '(!NF&&m=NR)||NR-m==2||NR-m==4' file
这可能对你有用(GNU sed(:
sed -n '/S/{n;p;n;n;p;:a;n;//ba;p}' file
为显式打印设置-n
选项。打印第二行和第四行,然后扔掉所有非空白行,打印第一行。重复