2014-03-05 63 views
0

我有一個小問題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期望OUTFILE == 4 $ 1> $ 2 & & NF == 3:

12:28, --:-- 
+1

當然我會編輯帖子。 Ta –

回答

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)字段分隔符都設置爲,
  • 接下來,處理行:它的字段 - 通過函數split() - 被存儲在數組變量line3fields中供以後使用。然後
  • getline線讀取下一個行 - 在這種情況下,第4行 - 爲$0,和它的令牌,$1$2,...
  • 因此if聲明在線的領域工作,而print聲明通過數組line3fields引用行的令牌。

至於你的原始代碼:

選好的匹配線與圖案NR==4,相關聯的動作(塊)將只爲該線路進行處理;因此,在您的區塊內,您不能直接參照其他行,條件如NR==3

的選項有:

  • 使用getline讀後續行(S),如上面我的代碼。
  • 單獨使用模式 - 動作對(例如,一個用於NR==3,另一個用於NR==4,並在變量中存儲感興趣的行以用於以後的操作)。
+0

嗨mklement0,這是我在awk中得到的。但是,如果不是那麼清楚,我很抱歉有時會解釋清楚。我想讀第4行的條件。所以,當閱讀第4行,如果$ 1> $ 2和字段數量== 3,然後打印第3行$ 1, - : - –

+0

@IanGooch:好的,我更新了我的代碼;看看是否有效。 – mklement0

+0

謝謝,我會給它以前的感謝 –

相關問題