2017-08-28 166 views
0

awk下面,我試圖匹配file1中的每行到file2中的一行。如果在兩個文件之間沒有找到匹配,則打印值file1後面跟着unknown。在第一個awk中,我收到else語句附近的Synatax錯誤,第二個語法爲next。我不確定爲什麼語法錯誤需要else來捕獲unknown條件,next告訴awk要處理下一行,對不對,或者我誤以爲是在思考?這兩個文件都是space-delimited,謝謝:)。awk打印匹配行或「未知」如果不匹配

file1的

A2M 
A4GALT 
A4GNT 
ABC34 

file2的

A2M AD 
ABC34 AD/AR 

期望的輸出

A2M AD 
A4GALT unknown 
A4GNT unknown 
ABC34 AD/AR 

AWK

awk 'NR==FNR{A[$1];next}$1 in A else { print "unknown" }' file1 file2 

awk 'BEGIN{FS=OFS="\t"} # define field and output seperators 
    FNR==NR{ # process each field in line of `file1` 
     for (i=1; i <= n; i++) { # execute loop 
     d[$1] = $1 # match first element and read into key d 
    } 
} 
    next # process next line 
}{print $1, ($1 in d?d[$1]:"unknown")}' file1 file2 # if no match 
print $1 followed by unknown 
+1

你有一個語法錯誤,因爲你的報價是不平衡的。嘗試將你的awk代碼移動到一個文件中 - 關於awk的一個鮮爲人知的事實是,你可以像使用任何其他編程語言一樣將你的代碼放在一個文件中,你不需要把它全部用單行來完成。 –

+0

如果這個事實「鮮爲人知」,我會感到驚訝,它正好位於每個awk手冊頁,書和POSIX規範的頂部/前面,並且經常在這裏和其他論壇的答案中使用。 –

回答

1

簡單加入 + 排序一個班輪到達目標:

join -a1 -a2 -e "unknown" -o1.1,2.2 <(sort file1) <(sort file2) 

輸出:

A2M AD 
A4GALT unknown 
A4GNT unknown 
ABC34 AD/AR 
1
awk 'NR==FNR{a[$1]=$2;next} {print $1, ($1 in a ? a[$1] : "unknown")}' file2 file1 

在第一個腳本語法錯誤是:

$1 in A else 

你大概的意思是:

!($1 in A) 

但我很好奇你是如何想出了 - 你用在什麼condition else有語言對於否定condition將是有效的語法?您已經提出了許多問題並收到了答案 - 他們都沒有使用!運營商嗎?

第二個腳本中的語法錯誤是因爲next超出了{...}對中的任何一對,並且您有太多的} s。你可以算他們看看。

+0

非常感謝。我試圖遵循'awk'{if($ 0 ==「your_match」){print「match」} else {print「no match」}}''像這樣......但我認爲'(condition {action} )'更多是我需要嘗試的。計數後我確實看到了額外的大括號,但它是在我發佈之後。我做了很多,但從他們身上學到更多:)。 – Chris

+0

我的觀點是,AFAIK沒有任何語言,否定'IF條件DO動作'的否定'IF條件ELSE動作',awk遵循與所有其他簡單的基於Algol的語言相同的規則,所以沒有理由瘋狂猜測在語法上,如果你不知道它 - 如果你不想閱讀手冊頁或查看腳本的其他例子,那麼至少嘗試一下你熟悉的任何其他語言的東西,而不是事物這不適用於任何語言。 –

1

我想出了這樣一個:

awk 'NR==FNR{ a[$1]; next }$1 in a{ print $1,$2; delete a[$1] }END{ for (i in a) print i, "unknown" }' file1 file2 | sort 

輸出:

A2M AD 
A4GALT unknown 
A4GNT unknown 
ABC34 AD/AR 
+0

你的意思是:awk'NR == FNR {a [$ 1];下一個}在{print $ 1,$ 2;刪除[$ 1]} END {for(i in a)print a [i],「unknown」}'file1 file2 |排序? – JFS31

+0

但是這並沒有給出預期的輸出,所以我爲什麼做了[$ 1] = $ 1。 – JFS31

+1

是的,現在工作:)我會在答案中改變它。 – JFS31