man*_*ius 4 sed awk text-processing
我试图用 sed 检索 2 行文本,每 10 行(10、11、20、21、30、31,...)。
对于第 10 行和第 11 行,我可以使用sed -n '10,11p' file或sed -n '10,+1p' file。而对于范围 (lines 10, 20, 30, ...) sed -n '10,~10p' file。但是有可能以某种方式将两者结合起来吗?
sed -n '10,~10,+1p' file 不管用。
我认为这是重复的,但我找不到任何参考。谢谢!
Sté*_*las 10
使用ADDR1,ADDR2with FIRST~STEPasADDR1和+OFFSETas ADDR2,所以:
$ seq 30 | sed '10~10,+1!d'
10
11
20
21
30
Run Code Online (Sandbox Code Playgroud)
无论如何,请注意~和+都是非标准的 GNU 扩展。
有关详细信息,请参阅GNU 系统上的info sed 'line selection'和info sed 'range of lines'。
POSIXly,你会使用:
seq 30 | sed -n '1n;n;n;n;n;n;n;n;n;p;n;p'
Run Code Online (Sandbox Code Playgroud)
怎么 awk解决?
awk '(FNR>1) && (FNR%10<2)' file
Run Code Online (Sandbox Code Playgroud)
FNR是awks 自动更新每个文件的行计数器{ ... })之外的任何计算结果为“真”(无论是 string 1)的条件都将指示awk打印当前行,包括迄今为止所做的所有修改。(FNR>1) && (FNR%10<2)将打印当前行,如果它不是第一行,并且行号是 10 的整数倍(或最多从这样的倍数增加 1)。这相当于“每 10 行和以下行”。