使用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