awk读取一行的条件,打印另一行的输出

时间:2014-03-05 09:30:57

标签: linux bash awk

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, --:--

1 个答案:

答案 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 }}。
  • 接下来,处理 3 行:其字段 - 通过函数, - 存储在数组变量split()中供以后使用。
  • 然后
  • line3fields行将 next 行 - 在本案例中为第4行 - 读入getline,将其标记读入$0$1 ,...
  • $2语句因此在 4 行的字段上运行,而if语句通过数组{引用行 3 的令牌{1}}。

至于原始代码:

一旦选择了带有模式print的匹配行,就只会为该行处理相关的操作(块);因此,在您的块中,您不能直接引用具有line3fields等条件的其他行。

您的选择是:

  • 使用NR==4读取后续行,如上面的代码所示。
  • 使用单独的模式 - 操作对(例如,一个用于NR==3,另一个用于getline,并将感兴趣的行存储在变量中以供稍后的操作使用)。