2013-07-17 80 views
1

我有一個簡單的命令(bash腳本的一部分),我通過awk管道,但似乎無法壓制最終的記錄分隔符,然後管道sed。 (是的,我有很多選擇,而我的是sed。)有沒有需要最後一根管的簡單方法?awk:刪除最後一個記錄分隔符在單線程

dolls = $(egrep -o 'alpha|echo|november|sierra|victor|whiskey' /etc/passwd \ 
| uniq | awk '{IRS="\n"; ORS=","; print}'| sed s/,$//); 

沒有sed的,這將產生輸出像echo,sierra,victor,,我只是想刪除最後一個逗號。

+1

沒有名爲「IRS」的awk變量。有「RS」,默認情況下它是一個換行符,所以如果這是你的意圖,就不需要設置它。此外,uniq的不會檢測重複的條目,除非線是相鄰的,所以你會更好用'排序-u'代替,而egrep的會拉出來的文本是它的字符串的一部分 - 真的是你想要的嗎?告訴我們最終的端到端你想用樣品的輸入和預期的輸出做什麼,我們可以幫助你。 –

+0

'='符號周圍不應該有空格 – doubleDown

+0

感謝關於IRS的說明。我是awk noob的一員,真的只用於管道處理。如果它沒有被忽略,分隔符已經不是\ n,我不得不從錯誤中學習。 :) 我使用'而不是'uniq'排序-u',因爲重複的名稱是從一行來在/ etc/passwd文件:第一個用戶名,然後在主目錄。他們幾乎保證連續。 – Rache

回答

3

你並不需要在awk,嘗試:

egrep -o ....uniq|paste -d, -s 

這裏是另一個例子:

kent$ echo "a 
b 
c"|paste -d, -s 
a,b,c 

另外我認爲你的鏈接命令可以簡化。 awk可以在一行中做所有事情。

+0

酷,我沒有在很長一段時間使用的粘貼命令,完全忘了這回事。這很優雅。謝謝。 N.B。:你的第一個例子有一個錯字。 'paste -d,s'需要'paste -d,-s' – Rache

2

相反的egrep,uniq的,AWK,SED等,這一切都可以在一個單一的awk命令來完成的:

awk -F":" '!($1 in a){l=l $1 ","; a[$1]} END{sub(/,$/, "", l); print l}' /etc/password 
0

既然你標記它bash這裏是做這件事的一種方法:

#!/bin/bash 

# Read the /etc/passwd file in to an array called names 
while IFS=':' read -r name _; do 
    names+=("$name"); 
done < /etc/passwd 

# Assign the content of the array to a variable 
dolls=$(IFS=, ; echo "${names[*]}") 

# Display the value of the variable 
echo "$dolls" 
1

這裏是一個小的和非常簡單的一行在AWK抑制最終的記錄分隔符:

echo -e "alpha\necho\nnovember" | awk 'y {print s} {s=$0;y=1} END {ORS=""; print s}' ORS="," 

給:

alpha,echo,november 

所以,你的例子變成:

dolls = $(egrep -o 'alpha|echo|november|sierra|victor|whiskey' /etc/passwd | uniq | awk 'y {print s} {s=$0;y=1} END {ORS=""; print s}' ORS=","); 

在粘貼或tr上使用awk的好處是,這也適用於多字符ORS。

相關問題