user393267
user393267

Reputation:

use awk to print a column, adding a comma

I have a file, from which I want to retrieve the first column, and add a comma between each value.

Example:

AAAA 12345 xccvbn
BBBB 43431 fkodks
CCCC 51234 plafad

to obtain

AAAA,BBBB,CCCC

I decided to use awk, so I did

awk '{ $1=$1","; print $1 }'

Problem is: this add a comma also on the last value, which is not what I want to achieve, and also I get a space between values.

How do I remove the comma on the last element, and how do I remove the space? Spent 20 minutes looking at the manual without luck.

Upvotes: 21

Views: 56444

Answers (11)

Marmelin
Marmelin

Reputation: 1

I used the following, because it lists the api-resource names with it, which is useful, if you want to access it directly. I also use a label "application" to find specific apps in a namespace:

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

Upvotes: 0

HAltos
HAltos

Reputation: 755

Surpised that no one is using OFS (output field separator). Here is probably the simplest solution that sticks with awk and works on Linux and Mac: use "-v OFS=," to output in comma as delimiter:

$ echo '1:2:3:4' | awk -F: -v OFS=, '{print $1, $2, $4, $3}' generates: 1,2,4,3

It works for multiple char too: $ echo '1:2:3:4' | awk -F: -v OFS=., '{print $1, $2, $4, $3}' outputs: 1.,2.,4.,3

Upvotes: 1

swapnil shashank
swapnil shashank

Reputation: 987

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

This is the shortest I know

Upvotes: 21

Syed Raihan
Syed Raihan

Reputation: 1

This can be very simple like this: awk -F',' '{print $1","$1","$2","$3}' inputFile

where input file is : 1,2,3 2,3,4 etc.

Upvotes: 0

stack0114106
stack0114106

Reputation: 8711

Using 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

$

Upvotes: 0

Oleg Neumyvakin
Oleg Neumyvakin

Reputation: 10272

In case somebody as me wants to use awk for cleaning docker images:

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

Upvotes: 1

kvantour
kvantour

Reputation: 26471

In this case, as simple cut and paste solution

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

Upvotes: 2

Ed Morton
Ed Morton

Reputation: 203209

$ awk '{printf "%s%s",sep,$1; sep=","} END{print ""}' file
AAAA,BBBB,CCCC

or if you prefer:

$ awk '{printf "%s%s",(NR>1?",":""),$1} END{print ""}' file
AAAA,BBBB,CCCC

or if you like golf and don't mind it being inefficient for large files:

$ awk '{r=r s $1;s=","} END{print r}' file
AAAA,BBBB,CCCC

Upvotes: 24

Jotne
Jotne

Reputation: 41446

Why make it complicated :) (as long as file is not too large)

awk '{a=NR==1?$1:a","$1} END {print a}' file
AAAA,BBBB,CCCC

For better porability.

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

Upvotes: 3

a5hk
a5hk

Reputation: 7834

awk 'NR==1{printf "%s",$1;next;}{printf "%s%s",",",$1;}' input.txt

It says: If it is first line only print first field, for the other lines first print , then print first field.

Output:

AAAA,BBBB,CCCC

Upvotes: 2

Nils-o-mat
Nils-o-mat

Reputation: 1257

You can do this:

awk 'a++{printf ","}{printf "%s", $1}' file

a++ is interpreted as a condition. In the first row its value is 0, so the comma is not added.

EDIT: If you want a newline, you have to add END{printf "\n"}. If you have problems reading in the file, you can also try:

cat file | awk 'a++{printf ","}{printf "%s", $1}'

Upvotes: 2

Related Questions