【问题标题】:Save print and hash output separately分别保存打印和哈希输出
【发布时间】:2022-01-25 11:53:16
【问题描述】:

awk 和 linux 环境的新手

Store    Sales    ID     
X        500      A1
X        600      A1
Y        200      A2
Z        300      A3
...

我有一个 csv 文件,我正在读取其中的 $2 列并将其保存到文件“book.csv”中。同时,我正在创建列 $3 的哈希文件并将其保存为“ID.csv”。我怎样才能在同一个命令中做到这一点?基本上将这两者合二为一。

awk -F '{ print $2 }' raw.csv > book.csv

awk -F '{a[$3]}END{for (x in a) print x}' raw.csv > ID.csv

【问题讨论】:

  • 当您说creating a hash file of column $3 时,您实际上只是指creating a list of the unique values from column $3,对吗?或者你真的想调用一些工具从 $3 生成哈希值?

标签: linux awk


【解决方案1】:
$ awk '{print $2 > "book.csv"} !seen[$3]++{print $3 > "ID.csv"}' raw.csv

$ cat book.csv 
Sales
500
600
200
300

$ cat ID.csv 
ID
A1
A2
A3

请注意,使用> 并不意味着文件每次都会被覆盖。如果文件在执行 awk 命令之前已经存在,那么这种情况只会发生一次。如果您希望附加到现有文件,请使用 >>

【讨论】:

    【解决方案2】:

    根据列名动态保存文件

    for i in 2 3; do
      column_name=$(cat raw.csv | awk "{print \$$i}" | head -n 1)
      cat raw.csv | awk "{print \$$i}" | tee $column_name.csv
    done
    

    创建 Sales.csv(第 2 列)ID.csv(第 3 列)


    编辑:上面给出的答案有点多余。参考下面的cmets


    【讨论】:

    • 这可能是不良做法的一个很好的例子。
    • 哦不!你能详细说明一下吗
    • 不需要循环,cats 都不需要,head 不需要,tee 也没用。不需要在双引号中转义 $。真的什么都说不准。
    • 你的代码可以写成awk 'NR==1{split($0,cn)} {for(i=2;i<=3;i++) print $i > (cn[i]".csv")}' input_file
    • 啊啊啊太棒了-谢谢!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 2014-11-30
    • 1970-01-01
    • 2022-12-10
    • 2014-10-18
    • 1970-01-01
    • 2011-10-27
    相关资源
    最近更新 更多