shell腳本,awk合並一列的問題。


文件 file2內容如下:
0 qwert
1 asdfghjk
2 asdjkl
2 zxcvbn
3 dfghjkll
4 22222
4 tyuiop
4 bnm

讓第一列相等的合並成一行,不要第一列,也就是變為如下格式:
22222;tyuiop;bnm
qwert
asdfghjk
asdjkl;zxcvbn
dfghjkll

第一種解法

 

解題思路:

awk '{if(a[$1]){a[$1]=a[$1]";"$2}else{a[$1]=$2}}END{for(i in a)print a[i]}' file2

file2

0 qwert
1 asdfghjk
2 asdjkl
2 zxcvbn
3 dfghjkll
4 22222
4 tyuiop
4 bnm

 第一行  if(a[0]) 因為a[0]沒有任何值,因此直接進行輸出else a[0]= qwert

 第二行  if(a[1]) 因為a[1]沒有任何值,因此直接進行輸出else a[1]= asdfghjk

 第三行  if(a[2]) 因為a[2]沒有任何值,因此直接進行輸出else a[2]= asdjkl

 第四行  if(a[2]) 因為a[2]= asdjkl,符合條件,執行a[$1]=a[$1]";"$2----> a[2]=a[2]";"$2--->a[2]=asdjkl;zxcvbn

 第五行 if(a[3]) 因為a[3]沒有任何值,因此直接進行輸出else a[3]= dfghjkll

 第六行 if(a[4]) 因為a[4]沒有任何值,因此直接進行輸出else a[4]=  22222

 第七行  if(a[4]) 因為a[4]= 22222,符合條件,執行a[$1]=a[$1]";"$2----> a[4]=a[4]";"$2--->a[4]=22222;tyuiop

 第八行  if(a[4]) 因為a[4]= 22222;tyuiop,符合條件,執行a[$1]=a[$1]";"$2----> a[4]=a[4]";"$2--->a[4]=22222;tyuiop;bnm

整個文件循環完畢后最后的結果是:

 a[0]= qwert

 a[1]= asdfghjk

 a[2]=asdjkl;zxcvbn

 a[3]= dfghjkll

 a[4]=22222;tyuiop;bnm

END{for(i in a)print a[i]}

使用for去數組a的下標 0 1 2 3 4

然后分別打印 a[0] a[1] a[2] a[3] a[4] 

(因為提取數組下標是一個不規則的輸出,因此這個結果可能是隨機排序)

第二種解法

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM