2013-08-23 60 views
-1

我需要的意義在以下UNIX代碼,並幫助我前進..

`awk -F "|" '{!a[$1]++}{printf RS $1}{print FS $2}' input.txt` 

我的樣品I/p文件就像下面

1|Balaji 1|Kumar 3|India 3|China 3|Australia 1|Dinesh 

我需要O/p像下面

1|Balaji|Kumar|Dinesh 3|India|China|Australia 
+0

我認爲這些名稱可以有空格。我對嗎?另外,你是否堅持使用'awk'或者你會接受更強大的語言,比如'perl'或'python'? – Birei

+0

爲什麼?你說什麼你想輸出給定的輸入,但不知道爲什麼Dinesh得到了3後,庫馬爾從中取出3等,我們只是猜測,可以給你一個完全不適當的答案,產生該具體輸出輸入,但在一般情況下是錯誤的。順便說一句,你發佈的awk腳本只是無稽之談,所以沒有必要解釋它。 –

回答

1

出人意料的是,它可以改變簡單。我不知道爲什麼[$ 1] ++裏面是寫that.Its過時overe有:

awk -F "|" '{printf RS $1}{print FS $2}' input.txt 

它會先打印記錄分隔符是換行,然後1 $這是第一場,然後字段分隔符是「|」然後是第二個字段$ 2,然後是換行符(因爲語句是打印的,如果使用printf,則不會打印換行符)。

基於您的評論,下面應該工作:

awk '{ 
     for(i=1;i<=NF;i++){split($i,a,"|"); 
          b[a[1]]?b[a[1]]=b[a[1]]" "a[2]:b[a[1]]=a[2] 
          } 
     for(j in b)printf j"|"b[j]" "; 
     print"";}' your_file 
+0

我的樣本I/P文件就像下面 1 |巴拉吉 1 |庫馬爾 3 |印度 3 |中國 3 |澳大利亞 1 |迪內希 我需要的O/P像下面 1 |巴拉吉|庫馬爾| Dinesh 3 |印度|中國|澳大利亞 – Balaji

2

在你的問題我就不解釋awk的線。因爲它沒有多大意義:

  • 創建數組a [],但從來沒有使用
  • RS的錯誤使用,FS

嘗試這一個班輪:

awk -F'[| ]' '{for(i=1;i<=NF;i++)if(i%2)a[$i]=a[$i]?a[$i]"|"$(i+1):$(i+1)} 
END{for(x in a) printf x"|"a[x]" ";print ""}' file 

用你的例子:

kent$ echo "1|Balaji 1|Kumar 3|India 3|China 3|Australia 1|Dinesh"|awk -F'[| ]' '{for(i=1;i<=NF;i++)if(i%2)a[$i]=a[$i]?a[$i]"|"$(i+1):$(i+1)}END{for(x in a) printf x"|"a[x]" ";print ""}' 
1|Balaji|Kumar|Dinesh 3|India|China|Australia 

請注意,會有一個結束空間,它可以在END循環中刪除。

1

更改記錄選擇器可以輕鬆讀取此數據。它只有一個小錯誤,我沒有看到如何解決,它打印在兩行。

awk -F\| '{a[$1]=a[$1]?a[$1]"|"$2:$2} END{for(i in a) printf i"|"a[i]" "}' RS=" " file 
1|Balaji|Kumar|Dinesh 
3|India|China|Australia 

新版本正確的輸出,得益於Birei

awk -F\| '{sub(/\n/,x, $0); a[$1]=a[$1]?a[$1]"|"$2:$2} END{for(i in a) printf i"|"a[i]" "}' RS=" " 
1|Balaji|Kumar|Dinesh 3|India|China|Australia 
+1

我認爲,當你改變* Record Separator *變量('RS')時,'awk'不會刪除最後一個換行符,所以你需要手動完成。使用'sub()'的一種方法:'sub(/ \ n /,「」,$ 0)' – Birei

+0

謝謝,更新了我的帖子:) – Jotne

+0

有兩個錯別字。第二個字段是替換字符串,在這種情況下應該是空白的,第三個字段是變量,我選擇了'$ 0',但也可能是最後一個'$ NF'。美元符號是需要引用他們中的任何一個。 – Birei