簡體   English   中英

Awk:在一行中刪除最后一個記錄分隔符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM