2012-12-20 28 views
3

我已經從在形式foreach循環輸出:awk中當列是occassionly空應對

ABC123603LP 44Bq AAAA  
ABC123603P  3BU  AAAA  
ABC123603ZZP   AAAA  
ABC123604DP 3BU  BBBB  
ABC123604LP 44Bq BBBB  
ABC123605AP 4q  CCCC  
ABC123605DP 33BGU CCCC  
ABC123606AP 35Bjq DDDD  
ABC123606DP 4B  DDDD 

從這我希望打印列1和2的終端與

echo ... | awk '{print $1, $2}' 

然而第三行和其他行打印ABC123603ZZP AAAA作爲第二列在這種情況下是空白的。我如何解決這個問題?

+2

是否想省略第二列爲空的行? – Mithrandir

+2

數據是固定寬度還是製表符分隔? –

回答

2

檢查場的數量在打印之前:

$ awk 'BEGIN {OFS="\t"}{ if (NF==2) print $1; else print $1, $2}' file 
ABC123603LP  44Bq 
ABC123603P  3BU 
ABC123603ZZP 
ABC123604DP  3BU 
ABC123604LP  44Bq 
ABC123605AP  4q 
ABC123605DP  33BGU 
ABC123606AP  35Bjq 
ABC123606DP  4B 
+2

我懷疑他有製表符分隔的輸入,所以我們應該相應地設置FS:'awk'BEGIN {FS = OFS =「\ t」} {print $ 1,$ 2}''。否則,我會使用'awk'BEGIN {FS = OFS =「\ t」} {print $ 1,(NF == 2?「」:$ 2)}'',這樣他就可以獲得一致的2場輸出,如果他需要進一步處理。 –

+0

好東西Ed .. –

1

您可以用sed來代替:

echo ... | sed 's/\(A[^ ]*[\t ]*\)\([^ \t]*[0-9][^ \t]*\)*.*/\1 \2/' 
+0

這給了我與回聲相同的輸出。包括第3列(AAAA等) – moadeep

+0

@moadeep您需要第3列作爲ABC123603ZZP,還是忽略? – sleepsort

+0

@billybob我需要列3省略。我現在有一個工作解決方案 – moadeep

0

一種技術,除去最後一列是讓AWK認爲有1個更少的字段:

awk -v OFS='\t' '{NF--; print}'