user3646742
user3646742

Reputation: 309

Bash then sorting it

Hey guys so i have this sample data from uniq-c:

100 c.m milk
99 c.s milk
45 cat food
30 beef

desired output:

beef,30
c.m milk,100
c.s milk,99
cat food,45

the thing i have tried are using:

awk -F " " '{print $2" " $3 " " $4 " " $5 "," $1}' stock.txt |sort>stock2.csv

i got :

beef   ,30
cat food
  ,45
c.m milk
  ,100
c.s milk
  ,99

think its because some item doesn't have 2,3,4,5 and i still use " ", and the sort in unix doesn't prioritise dot first unlike sql. however i'm not too sure how to fix it

Upvotes: 0

Views: 128

Answers (5)

Ed Morton
Ed Morton

Reputation: 204311

$ awk '{$0=$0","$1; sub(/^[^[:space:]]+[[:space:]]+/,"")} 1' file | LC_ALL=C sort
beef,30
c.m milk,100
c.s milk,99
cat food,45

Upvotes: 2

Rene Knop
Rene Knop

Reputation: 1836

Combining additional information from this thread with awk, the following script is a possible solution:

awk ' { printf "%s", $2; if ($3) printf " %s", $3; printf ",%d\n", $1; } ' stock.txt | LC_ALL=C sort > stock2.csv

It works well in my case. Nevertheless, I would prefer nbari's solution because it is shorter.

Upvotes: 2

nbari
nbari

Reputation: 26985

To obtain your desired output you could sort first your current input and then try to swap the columns.

Using awk, please give a try to this:

$ sort -k2 stock.txt | awk '{t=$1; sub($1 FS,""); print $0"," t}'

It will output:

beef,30
c.m milk,100
c.s milk,99
cat food,45

Upvotes: 2

anubhava
anubhava

Reputation: 785771

You can use sed + sort:

sed -E 's/^([^[:blank:]]+)[[:blank:]]+(.+)/\2,\1/' file | C_ALL=C sort

beef,30
c.m milk,100
c.s milk,99
cat food,45

Upvotes: 1

gbt
gbt

Reputation: 809

i think you can solve it in bash using some easy commands, if the format of the file is as you posted it:

prova.txt is your file.

then do:

cat prova.txt  | cut -d" " -f2,3 > first_col
cat prova.txt  | cut -d" " -f1 > second_col
paste -d "," first_col second_col | sort -u > output.csv
rm first_col second_col

in output.txt you have your desired output in CSV format!

EDIT:

after reading and applying PesaThe comment, the code is way easier:

paste -d, <(cut -d' ' -f2- prova.txt) <(cut -d' ' -f1 prova.txt) | sort -u > output.csv

Upvotes: 2

Related Questions