2017-06-01 32 views
-2

我想用awk/sed處理以下兩個文件(A.TXT和b.txt),並得到結果 cat a.txt如何用awk/sed來處理這兩個文件得到的結果,我想

a UK 
b Japan 
c China 
d Korea 
e US 

而且cat b.txt導致

c Russia 
e Canada 

我需要的結果如下:

a UK 
b Japan 
c Russia 
d Korea 
e Canada 
+4

你嘗試過什麼解決呢? – Sundeep

+0

[編輯]你的問題,並使用'{}'按鈕來格式化你的輸入,輸出和代碼。 –

+0

謝謝。我試過用awk來解決這個問題。不過,我是awk的新手。你們能給我一些提示嗎?謝謝 –

回答

0

嘗試:

awk 'FNR==NR{A[$1]=$NF;next} {printf("%s %s\n",$1,$1 in A?A[$1]:$NF)}' b.txt a.txt 

檢查這裏的條件FNR == NR這將是隻有當讀取第一個文件(b.txt)TRUE。然後創建一個名爲A的數組,其索引爲$ 1,並具有值最後一列。然後使用printf打印2個字符串,其中第一個字符串是$ 1,另一個是如果a.txt中的$ 1存在於數組A中,則打印數組A的索引爲$ 1的值,否則打印a.tzt本身的最後一列。

編輯:因爲OP有馬車字符到Input_files所以請刪除他們也遵循。

tr -d '\r' <b.txt> temp_b.txt && mv temp_b.txt b.txt 
+1

你有正確的想法,但 - 爲什麼使用名爲「A」的數組來表示名爲「b」的文件的內容,特別是當其他文件被命名爲「a」時,爲什麼要混淆你的代碼?不要將所有大寫變量名稱用於在線討論的所有常見原因。爲了便於跨awk版本添加三元表達式的加括號(某些awks會在某些情況下會出現語法錯誤)。爲什麼在簡單打印時使用printf呢?當你的代碼依賴於只有2個字段時,爲什麼使用$ NF而不是$ 2?請參閱https://stackoverflow.com/a/44311894/1745001。 –

+0

有時第一行不會改變,其餘的都可以。我不知道爲什麼,你能給我一些提示 –

+0

請給我們展示一些例子,我們可以幫助更多。 – RavinderSingh13

0

您可以使用下面的一行:

join -a 1 -a 2 a.txt <(awk '{print $1, "--", $0, "--"}' < b.txt) | sed 's/ --$//' | awk -F ' -- ' '{print $NF}' 

我們用awk前綴b.txt每一行的一個鍵和--以後給我們一個分割點:

<(awk '{print $1, "--", $0, "--"}' < b.txt) 

使用join命令加入公共密鑰上的文件。該-a 1選項告訴命令

join -a 1 -a 2 a.txt <(awk '{print $1, "--", $0, "--"}' < b.txt) 

用sed刪除--部分是上線的一些終端:

sed 's/ --$//' 

用awk在每行的最後一個項目:

awk -F ' -- ' '{print $NF}' 
+0

或打印第一列和最後一列:'join -a 1 file1 file2 | awk'{print $ 1,$ NF}'' – Cyrus

+0

@Cyrus:假定輸入文件只包含每個鍵的一個單詞。 「韓國」只會導致「韓國」。 –

+1

是的,我只用了Yu Franco的例子。 – Cyrus

1

用awk:

先填充aray/hash a與完整行($0)並使用此行中的第一列($1)作爲索引。最後,用循環打印所有數組/散列a的元素。

awk '{a[$1]=$0} END{for(i in a) print a[i]}' file1 file2 

輸出:

 
a UK 
b Japan 
c Russia 
d Korea 
e Canada 
0
$ awk 'NR==FNR{b[$1]=$2;next} {print $1, ($1 in b ? b[$1] : $2)}' b.txt a.txt 
a UK 
b Japan 
c Russia 
d Korea 
e Canada 
相關問題