awk
我遇到一个小问题,我找不到解决方法。
我想在语法中交换NR ==所以我读了NR == 4并输出NR == 3的条件。
awk -F 'NR ==4 { if ($1 < $2 && NF ==4) print $2 "," $4;
if ($1 < $2 && NF ==3) print $2 "," "--";
if ($1 > $2 && NF ==4) print $1 "," $3;
if ($1 > $2 && NF ==3) print $1 "," "--";
}' infile > outfile
我想要的是上面的内容(读取NR == 4但输出NR == 3)
awk -F 'NR ==4 { if ($1 < $2 && NF ==4) NR ==3 print $2 "," $4;
NR ==4 if ($1 < $2 && NF ==3) NR ==3 print $2 "," "--";
NR ==4 if ($1 > $2 && NF ==4) NR ==3 print $1 "," $3;
NR ==4 if ($1 > $2 && NF ==3) NR ==3 print $1 "," "--";
}' infile > outfile
infile中:
05:45,11:55,17:37,09:59
0.2,2.3,0.4,2.6
06:18,12:28,18:15
2.3,2.2,0.6
此条件的期望输出文件,其中NR == 4 $ 1&gt; $ 2&amp;&amp; NF == 3:
12:28, --:--
答案 0 :(得分:2)
我不清楚你想要什么,你的样本输出似乎与你的awk程序不一致,但也许这会让你开始:
awk 'BEGIN{FS=OFS=","}
NR==3 {
split($0, line3fields);
getline;
if ($1 < $2 && NF==4) print line3fields[2], line3fields[4]
if ($1 < $2 && NF==3) print line3fields[2], "--:--"
if ($1 > $2 && NF==4) print line3fields[1], line3fields[3]
if ($1 > $2 && NF==3) print line3fields[1], "--:--"
}
' infile > outfile
BEGIN
阻止:由于您的输入和输出是,
- 已分隔,因此将输入(FS
)和输出(OFS
)字段分隔符设置为{{1 }}。,
- 存储在数组变量split()
中供以后使用。line3fields
行将 next 行 - 在本案例中为第4行 - 读入getline
,将其标记读入$0
,$1
,... $2
语句因此在 4 行的字段上运行,而if
语句通过数组{引用行 3 的令牌{1}}。至于原始代码:
一旦选择了带有模式print
的匹配行,就只会为该行处理相关的操作(块);因此,在您的块中,您不能直接引用具有line3fields
等条件的其他行。
您的选择是:
NR==4
读取后续行,如上面的代码所示。NR==3
,另一个用于getline
,并将感兴趣的行存储在变量中以供稍后的操作使用)。