使用awk打印列,添加逗号

使用awk打印列,添加逗号,awk,Awk,我有一个文件,我想从中检索第一列,并在每个值之间添加一个逗号 例如: AAAA 12345 xccvbn BBBB 43431 fkodks CCCC 51234 plafad 取得 AAAA,BBBB,CCCC AAAA,BBBB,CCCC 我决定用awk,所以我用了 awk '{ $1=$1","; print $1 }' 问题是:这在最后一个值上添加了一个逗号,这不是我想要实现的,而且我在值之间得到了一个空格 如何删除最后一个元素上的逗号,以及如何删除空格?不走运地看了20分钟手册

我有一个文件,我想从中检索第一列,并在每个值之间添加一个逗号

例如:

AAAA 12345 xccvbn
BBBB 43431 fkodks
CCCC 51234 plafad
取得

AAAA,BBBB,CCCC
AAAA,BBBB,CCCC
我决定用awk,所以我用了

awk '{ $1=$1","; print $1 }'
问题是:这在最后一个值上添加了一个逗号,这不是我想要实现的,而且我在值之间得到了一个空格

如何删除最后一个元素上的逗号,以及如何删除空格?不走运地看了20分钟手册。

您可以这样做:

awk 'a++{printf ","}{printf "%s", $1}' file
++被解释为一个条件。在第一行中,其值为0,因此不添加逗号

编辑: 如果需要换行符,则必须添加
END{printf“\n”}
。如果读取文件时遇到问题,也可以尝试:

cat file | awk 'a++{printf ","}{printf "%s", $1}'
它说:如果它是第一行只打印第一个字段,对于其他行,首先打印
,然后打印第一个字段

输出:

或者,如果您愿意:

$ awk '{printf "%s%s",(NR>1?",":""),$1} END{print ""}' file
AAAA,BBBB,CCCC
或者,如果您喜欢高尔夫,并且不介意它对大文件效率低下:

$ awk '{r=r s $1;s=","} END{print r}' file
AAAA,BBBB,CCCC
为什么要把它复杂化:)(只要文件不太大)

为了更好的可移植性

awk '{a=(NR>1?a",":"")$1} END {print a}' file

在这种情况下,作为简单的剪切和粘贴解决方案

cut -d" " -f1 file | paste -s -d,

如果像我这样的人想使用awk清理docker图像:

docker image ls | grep tag_name | awk '{print $1":"$2}'
使用Perl

$ cat group_col.txt
AAAA 12345 xccvbn
BBBB 43431 fkodks
CCCC 51234 plafad

$ perl -lane ' push(@x,$F[0]); END { print join(",",@x) } ' group_col.txt
AAAA,BBBB,CCCC

$

这可以非常简单,如下所示:
awk-F'、“{print$1”、“$1”、“$2”、“$3}”输入文件

其中输入文件为:
1,2,3
2,3,4等

awk {'print $1","$2","$3'} file_name

这是我所知道的最短的

令人惊讶的是,没有人使用OFS(输出字段分隔符)。下面可能是使用awk并在Linux和Mac上工作的最简单的解决方案:使用“-v OFS=,”以逗号作为分隔符输出:

$echo'1:2:3:4'| awk-F:-v OFS=,“{print$1,$2,$4,$3}”生成: 1,2,4,3

它也适用于多个字符: $echo'1:2:3:4'| awk-F:-v OFS=,“{打印$1,$2,$4,$3}”输出:
1,2,4,3

我使用了以下内容,因为它列出了api资源名称,如果您想直接访问它,这很有用。我还使用标签“应用程序”查找命名空间中的特定应用程序:


kubectl-n ops tools get$(kubectl api resources--no headers=true--sort by=name | awk'{printf“%s%s”,sep,$1;sep=“,”}')-l app.kubernetes.io/instance=application

您可能会发现这很有用:不。使用awk添加逗号,然后将其管道传输到sed以删除逗号是一种荒谬的方法。只需不添加逗号即可。+1的可能重复项:
awk'{printf“%s”,(NR==1?$1:“,$1)}结束{print”“}文件
可能更合适。这不会在结尾添加新行。我看不出OP会说什么。请考虑<代码> < <代码>和<代码> NR < /代码>之间的区别。添加换行符是
print”“
。为什么你读文件会有问题?我不明白你第一句话的意思?但也许使用NR作为条件会更优雅。谢谢你的新线提示。对,只是因为已经提供了
NR
,所以您不需要单独的变量来计算记录数。回答您的问题:这可能没问题,但对于大文件来说,由于字符串连接操作速度慢,而且您将要生成的字符串的大小,这比打印每行要慢得多。通过两次指定
$1
,这里也有一些冗余,并且非括号三元运算符可能在某些AWK上失败。@EdMorton同意,但OP没有说明文件大小。对,因此“可能没问题”。FWIW
'{a=a(NR>1?,“:”)$1}END{print a}'
将解决冗余和可移植性问题。@EdMorton我确实看到我可以从测试中取出
$1
,但我需要括号(无论如何都应该使用),并且需要添加
使它变得更长。哇,这是非常光明的:在第一次
printf
之后定义
sep
使它不会第一次出现。一些高尔夫球
awk'{printf(NR>1?,“:”)“%s”,$1}END{print”“}
如果你想打高尔夫球,那么
awk'{a=a s$1;s=“,“}END{print a}
,但是我觉得它越来越不清晰,而且对大文件来说效率更低。谢谢,这听起来很简单。尽管这没有使用query.Perfect中所述的
awk
。简单而简短。
docker image ls | grep tag_name | awk '{print $1":"$2}'
$ cat group_col.txt
AAAA 12345 xccvbn
BBBB 43431 fkodks
CCCC 51234 plafad

$ perl -lane ' push(@x,$F[0]); END { print join(",",@x) } ' group_col.txt
AAAA,BBBB,CCCC

$
awk {'print $1","$2","$3'} file_name