我有一个文件,想要获取第一列,并在每个值之间添加逗号。
例如:
AAAA 12345 xccvbn
BBBB 43431 fkodks
CCCC 51234 plafad
获得
AAAA,BBBB,CCCC
我决定使用awk,于是我这样做了。
awk '{ $1=$1","; print $1 }'
问题是:这会在最后一个值上加上逗号,而这不是我想要的,同时每个值之间还有空格。
我该如何去除最后一个元素上的逗号,并消除空格呢?已经在手册中寻找了20分钟但没有成功。我有一个文件,想要获取第一列,并在每个值之间添加逗号。
例如:
AAAA 12345 xccvbn
BBBB 43431 fkodks
CCCC 51234 plafad
获得
AAAA,BBBB,CCCC
我决定使用awk,于是我这样做了。
awk '{ $1=$1","; print $1 }'
问题是:这会在最后一个值上加上逗号,而这不是我想要的,同时每个值之间还有空格。
我该如何去除最后一个元素上的逗号,并消除空格呢?已经在手册中寻找了20分钟但没有成功。$ awk '{printf "%s%s",sep,$1; sep=","} END{print ""}' file
AAAA,BBBB,CCCC
或者如果你喜欢的话:
$ 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
printf
之后定义sep
会使其第一次不出现。 - fedorquiawk '{printf (NR>1?",":"")"%s",$1} END{print ""}'
- Jotneawk '{a=a s$1;s=","} END{print a}'
,但在我看来,这种方法对于大文件来说效率越来越低,并且越来越不清晰。 - Ed Mortonawk {'print $1","$2","$3'} file_name
这是我所知道的最短的。
$1
。另外,逗号两侧会有一个空格。 - Kaushikawk '{a=NR==1?$1:a","$1} END {print a}' file
AAAA,BBBB,CCCC
awk '{a=(NR>1?a",":"")$1} END {print a}' file
$1
时有些冗余,并且非括号化的三元运算符可能会在某些awk中失败。 - Ed Morton'{a=a (NR>1?",":"") $1} END {print a}'
可以解决冗余和可移植性问题。 - Ed Morton$1
,但是那样我需要括号(本来就应该使用),并且需要添加 ""
使其更长。 - Jotnecut -d" " -f1 file | paste -s -d,
awk
。 - susenjawk 'NR==1{printf "%s",$1;next;}{printf "%s%s",",",$1;}' input.txt
,
,然后再打印第一个字段。
输出:
AAAA,BBBB,CCCC
awk '{printf "%s",(NR==1?$1:","$1)}END{print ""}' file
可能更合适。 - jaypal singhawk 'a++{printf ","}{printf "%s", $1}' file
a++被解释为一个条件语句。在第一行中,它的值为0,因此逗号不会被添加。
编辑:
如果您想要换行,您需要添加END{printf "\n"}
。如果您在读取文件时遇到问题,也可以尝试:
cat file | awk 'a++{printf ","}{printf "%s", $1}'
a
和 NR
之间的区别。添加换行符是 print ""
。为什么读取文件会出现问题? - Ed MortonNR
已经提供了,所以你不需要一个单独的变量来计算记录数。 - Ed Morton$ 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 =。'{print $ 1,$ 2,$ 4,$ 3}'输出: 1.,2.,4.,3
如果有人像我一样想使用awk来清理docker镜像:
docker image ls | grep tag_name | awk '{print $1":"$2}'
awk -F',' '{print $1","$1","$2","$3}' inputFile
其中输入文件是:1,2,3
2,3,4
等。使用 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
$
-F,
来让你的输入字段分隔符为逗号(或其他你喜欢的任何字符),那么BEGIN{OFS=FS}
块将会把输出字段分隔符设为相同的。 - Marcel Besixdouze