[英]Bash then sorting it
大家好,我從uniq-c獲得了以下示例數據:
100 c.m milk
99 c.s milk
45 cat food
30 beef
所需的輸出:
beef,30
c.m milk,100
c.s milk,99
cat food,45
我嘗試過的東西正在使用:
awk -F " " '{print $2" " $3 " " $4 " " $5 "," $1}' stock.txt |sort>stock2.csv
我有 :
beef ,30
cat food
,45
c.m milk
,100
c.s milk
,99
認為這是因為某些項目沒有2,3,4,5並且我仍然使用“”,並且unix中的排序不像sql那樣優先點的優先級。 但是我不太確定如何解決它
我認為您可以使用一些簡單的命令在bash中解決它,如果文件的格式與您發布的格式相同:
prova.txt是您的文件。
然后做:
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
在output.txt中,您具有CSV格式的所需輸出!
編輯:
閱讀並應用Pesa注釋后,代碼變得更簡單:
paste -d, <(cut -d' ' -f2- prova.txt) <(cut -d' ' -f1 prova.txt) | sort -u > output.csv
為了獲得所需的輸出,您可以先對當前輸入進行sort
,然后嘗試交換列。
使用awk
,請嘗試以下操作:
$ sort -k2 stock.txt | awk '{t=$1; sub($1 FS,""); print $0"," t}'
它將輸出:
beef,30
c.m milk,100
c.s milk,99
cat food,45
從結合其他信息這螺紋與awk
,下面的腳本是一個可能的解決方案:
awk ' { printf "%s", $2; if ($3) printf " %s", $3; printf ",%d\n", $1; } ' stock.txt | LC_ALL=C sort > stock2.csv
就我而言,它運作良好。 不過,我更喜歡nbari的解決方案,因為它的時間更短。
$ 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
您可以使用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.