2016-10-08 74 views
1

文件1:emp.txt如何根據兩個文件中的匹配列找到列的值?

7839|KING|PRESIDENT||17-Nov-81|5000||10 
7698|BLAKE|MANAGER|7839|01-May-81|2850||30 
7782|CLARK|MANAGER|7839|09-Jun-81|2450||10 
7566|JONES|MANAGER|7839|02-Apr-81|2975||20 
7788|SCOTT|ANALYST|7566|19-Apr-87|3000||20 
7902|FORD|ANALYST|7566|03-Dec-81|3000||20 
7369|SMITH|CLERK|7902|17-Dec-80|800||20 
7499|ALLEN|SALESMAN|7698|20-Feb-81|1600|300|30 
7521|WARD|SALESMAN|7698|22-Feb-81|1250|500|30 
7654|MARTIN|SALESMAN|7698|28-Sep-81|1250|1400|30 

文件2:dept.txt

10|ACCOUNTING|NEW YORK 
    20|RESEARCH|DALLAS 
    30|SALES|CHICAGO 
    40|OPERATIONS|BOSTON 

我想打印輸出如下:

7839|KING|PRESIDENT||17-Nov-81|5000||10|NEW YORK 
7698|BLAKE|MANAGER|7839|01-May-81|2850||30|CHICAGO 
7782|CLARK|MANAGER|7839|09-Jun-81|2450||10|NEW YORK 
7566|JONES|MANAGER|7839|02-Apr-81|2975||20|DALLAS 
7788|SCOTT|ANALYST|7566|19-Apr-87|3000||20|DALLAS 
7902|FORD|ANALYST|7566|03-Dec-81|3000||20|DALLAS 
7369|SMITH|CLERK|7902|17-Dec-80|800||20|DALLAS 
7499|ALLEN|SALESMAN|7698|20-Feb-81|1600|300|30|CHICAGO 
7521|WARD|SALESMAN|7698|22-Feb-81|1250|500|30|CHICAGO 
7654|MARTIN|SALESMAN|7698|28-Sep-81|1250|1400|30|CHICAGO 

我想下面的awk語句,但它不打印任何東西 -

awk -F'|' 'NR==FNR {val[$1]=$3; next} $8 in val {print $1,$2,$3,$4,$5,$6,$7,$8,val[$1]}' OFS="|" dept.txt emp.txt 

任何建議?

+1

沒有你忘了'-F \ |'? –

+0

感謝回答,我只注意到我錯過了現場分隔符,但我想與太多,但仍然沒有運氣... –

回答

1

的問題是有在匹配列前面兩個空間。由於您使用'|'作爲你的字段分隔符,然後如下第二個文件的每行分開。(使用第一行作爲例子。)

10|ACCOUNTING|NEW YORK 

$1=" 10" 
$2="ACCOUNTING" 
$3="NEW YORK" 

所以你映射Accounting" 10"而非"10"。這就是爲什麼你沒有在第二個文件中得到任何匹配。 (假設你想在第二個打印命令中使用val [$ 8]而不是val [$ 1])。

做到以下幾點。這將解決您的問題。

awk -F'|' 'NR==FNR {sub(" ","",$1);val[$1]=$3; next;} $8 in val {print $1,$2 
,$3,$4,$5,$6,$7,$8,val[$8]}' OFS="|" dept.txt emp.txt 

輸出:

7839|KING|PRESIDENT||17-Nov-81|5000||10|NEW YORK 
7698|BLAKE|MANAGER|7839|01-May-81|2850||30|CHICAGO 
7782|CLARK|MANAGER|7839|09-Jun-81|2450||10|NEW YORK 
7566|JONES|MANAGER|7839|02-Apr-81|2975||20|DALLAS 
7788|SCOTT|ANALYST|7566|19-Apr-87|3000||20|DALLAS 
7902|FORD|ANALYST|7566|03-Dec-81|3000||20|DALLAS 
7369|SMITH|CLERK|7902|17-Dec-80|800||20|DALLAS 
7499|ALLEN|SALESMAN|7698|20-Feb-81|1600|300|30|CHICAGO 
7521|WARD|SALESMAN|7698|22-Feb-81|1250|500|30|CHICAGO 
7654|MARTIN|SALESMAN|7698|28-Sep-81|1250|1400|30|CHICAGO 
+0

驗證。看起來這是一個格式化問題,在dept.txt文件的開頭部分有一些空格,但是將sub函數引入到圖片中,這對我來說是一種學習。 –

+1

如果僅僅有一些簡短的方式來寫'打印$ 1,$ 2,$ 3,$ 4 $ 5,$ 6,$ 7 8' $用於記錄與8個字段...(提示:'$ 0')。 –

0

在你的代碼行,你應該叫由具有在那裏你散列每個值,在你的情況下,ID列中的散列值,列8是存儲常用ID爲文件中的一個,你要打印的信息出。

awk -F\| 'NR==FNR {val[$1]=$3; next} {print $1, $2, $3, $4, $5, $6, $7, $8, val[$8]};' OFS="|" dept.txt emp.txt 
2

使用$NF,這是最後一個字段的值:

➜ awk ' 
    BEGIN { FS = OFS = "|" } 
    NR==FNR { location[$1] = $NF; next } 
    { print (location[$NF] ? $0 OFS location[$NF] : $0) } 
' dept.txt emp.txt 
7839|KING|PRESIDENT||17-Nov-81|5000||10|NEW YORK 
7698|BLAKE|MANAGER|7839|01-May-81|2850||30|CHICAGO 
7782|CLARK|MANAGER|7839|09-Jun-81|2450||10|NEW YORK 
7566|JONES|MANAGER|7839|02-Apr-81|2975||20|DALLAS 
7788|SCOTT|ANALYST|7566|19-Apr-87|3000||20|DALLAS 
7902|FORD|ANALYST|7566|03-Dec-81|3000||20|DALLAS 
7369|SMITH|CLERK|7902|17-Dec-80|800||20|DALLAS 
7499|ALLEN|SALESMAN|7698|20-Feb-81|1600|300|30|CHICAGO 
7521|WARD|SALESMAN|7698|22-Feb-81|1250|500|30|CHICAGO 
7654|MARTIN|SALESMAN|7698|28-Sep-81|1250|1400|30|CHICAGO 

這是假設你還是想整條生產線,無論是否系城市指數存在。如果不是,那麼請更新您的問題以反映常見用例和預期輸出。

+0

它在這種情況下工作正常,但它會像右外連接一樣工作,比方說,如果我將從dept.txt文件中刪除記錄10,它將從最後一列中的位置詳細信息中打印emp.txt文件中的所有記錄。如果我只想加入匹配列,那麼我們需要修改下面的打印語句 - awk'BEGIN {FS = OFS =「|」 } NR == FNR {location [$ 1] = $ NF;下一個} $ 8位置{print $ 0,location [$ NF]}'dept.txt emp.txt 不知道如何使用三元運算符做到這一點。讓我知道你的建議。 –

+1

沒錯。只需稍作調整即可避免必須指定公共部分('$ 0')兩次,並使測試更加健壯:'print $ 0($ NF in location?OFS location [$ NF]:「」) –

相關問題