[英]Awk: Drop last record separator in one-liner
我有一個簡單的命令(bash 腳本的一部分),我正在通過 awk 進行管道傳輸,但似乎無法在沒有管道傳輸到 sed 的情況下抑制最終記錄分隔符。(是的,我有很多選擇,我的是 sed。)是有不需要最后一個 pipe 的更簡單的方法嗎?
dolls = $(egrep -o 'alpha|echo|november|sierra|victor|whiskey' /etc/passwd \
| uniq | awk '{IRS="\n"; ORS=","; print}'| sed s/,$//);
如果沒有 sed,這會產生 output,就像echo,sierra,victor,
我只是想去掉最后一個逗號。
您不需要awk,請嘗試:
egrep -o ....uniq|paste -d, -s
這是另一個示例:
kent$ echo "a
b
c"|paste -d, -s
a,b,c
另外,我認為可以簡化鏈接命令。 awk可以一站式完成所有工作。
除了egrep,uniq,awk,sed等之外,所有這些都可以在一個awk命令中完成:
awk -F":" '!($1 in a){l=l $1 ","; a[$1]} END{sub(/,$/, "", l); print l}' /etc/password
這是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=",");
使用awk而不是paste或tr的好處是,它也可用於多字符ORS。
由於您已將其標記為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"
echo "a
b
c" |
mawk 'NF-= _==$NF' FS='\n' OFS=, RS=
a,b,c
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.