Bash然后对其进行排序



嘿伙计们,所以我有来自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 那样优先考虑点。但是我不太确定如何解决它

要获得所需的输出,您可以先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

我认为您可以使用一些简单的命令在 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

在输出中.txt您有所需的 CSV 格式输出!

编辑:

阅读并应用 Pesa注释后,代码更容易:

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

将此线程中的其他信息与awk相结合,以下脚本是一个可能的解决方案:

awk ' { printf "%s", $2; if ($3) printf " %s", $3; printf ",%dn", $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

相关内容

  • 没有找到相关文章

最新更新