簡體   English   中英

重擊然后排序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM