如何用 ',' 分隔输出记录,同时避免 awk 中的尾随逗号

如何用 ',' 分隔输出记录,同时避免 awk 中的尾随逗号

考虑以下awk语句及其输出:

$ awk -F "/" '/\/tcp/ {print $1}' input_file

10\n
20\n

我想要的输出是:

10,20

我尝试的是:

$ awk -F "/" 'BEGIN{ORS=","} /\/tcp/ {print $1}' input_file
10,20,

如何去掉末尾的逗号?

答案1

不要将 ORS 设置为,,因为这样你的脚本的输出不会以换行符结尾,因此它不是每个 POSIX 的有效文本文件,因此与你调用的其他脚本使用它所做的事情是一样的。相反,不要管 ORS,这样它就会保留您的平台应该具有的任何值,并在,您想要输出的每个字符串之前打印除第一个字符串之外的每个字符串:

awk -F '/' '/\/tcp/{printf "%s%s", sep, $1; sep=","} END{print ""}'

例如:

$ seq 3 | awk '{printf "%s%s", sep, $0; sep=","} END{print ""}'
1,2,3

答案2

就我个人而言,我会在打印后删除逗号:

awk -F "/" 'BEGIN{ORS=","}/\/tcp/ {print $1}' | sed 's/,$//'

或者,添加尾随换行符:

awk -F "/" 'BEGIN{ORS=","}/\/tcp/ {print $1}' | sed 's/,$/\n/'

如果你真的想在 中执行此操作awk,你可以尝试这种相当不优雅的方法:

awk -F "/" '/\/tcp/{ if(NR == 1){ printf "%s", $1} else{ printf ",%s",$1}}'

并且,要添加尾随换行符:

awk -F "/" '/\/tcp/{ if(NR == 1){ printf "%s", $1} else{ printf ",%s",$1}}END{print ""}'

答案3

一个无awk答案的人,假设问题就像描述的那样简单:

paste -s -d',' input_file

-s, --serial表示它将按顺序处理文件(paste通常用于合并多个文件中的行)

-d, --delimiters指定分隔符(默认为制表符)

答案4

您正在做的是根据多行收集的数据构建单个输出记录。那么让我们这样做:

awk -F '/' '
    BEGIN { OFS = "," }
    /\/tcp/ { a[++n] = $1 }
    END {
        $0 = ""
        for (i = 1; i <= n; ++i)
            $i = a[i]
        print
    }' input_file

这会将数据收集到数组中a,并在END块中使用该数组中的字段构建一个新记录。在非常最后,打印记录。由于我们OFS在块中设置为逗号,因此字段将用逗号分隔BEGIN

测试:

$ awk -F '/' 'BEGIN {OFS=","} /\/tcp/ {a[++n]=$1} END {$0="";for (i=1;i<=n;++i) $i = a[i];print}' <<END_INPUT
first/tcp
no relevant
second/tcp
third/tcp
END_INPUT
first,second,third

(上面的最后一行是输出,而输入是通过以 分隔的此处文档提供的END_INPUT。)

相关内容