【问题标题】:matching patterns and create new files匹配模式并创建新文件
【发布时间】:2020-09-04 07:42:00
【问题描述】:

我有一个名为 file1.csv 的 csv 文件:

某事;AD;sss;安道尔;没有;type_1;sss something222;AD;sss222;安道尔;nothing222;type_2;aaa 事物;NL;thing3;荷兰;事物;type_2;bb 等;美国;等;美国;等;type_2;无

我想为每个国家/地区创建单独的文件。我做这样的greps:

grep -e "\;AD\;.*\;Andorra\;" file1.csv > fileAD.csv
grep -e "\;NL\;.*\;Netherlands\;" file1.csv > fileNL.csv
grep -e "\;US\;.*\;United\sStates\;" file1.csv > fileUS.csv

这行得通,但我有世界上所有国家。而且我不想为每个国家写这些行。还有其他解决方案吗?任何帮助真的很感激。

编辑:我更新了我的问题。我还有一个 type_1 和 type_2 的列。在创建了每个国家/地区对应的所有文件之后,我需要为每个国家/地区创建只有 type_1 的新文件和只有 type_2 的新文件。

例如,对于安道尔,我需要以下文件:
文件AD.csv:

某事;AD;sss;安道尔;没有;type_1;sss something222;AD;sss222;安道尔;nothing222;type_2;aaa

fileADtype_1.csv:

某事;AD;sss;安道尔;没有;type_1;sss

fileADtype_2.csv:

something222;AD;sss222;安道尔;nothing222;type_2;aaa

我认为只查找带有缩写的列是可以的,但出于安全原因,我想要两列,一列带有“AD”,另一列带有全名“Andorra”。

【问题讨论】:

  • @Sundeep,谢谢。我更新了我的问题。你的回应有效。我认为这很好,我认为两个国家不能有相同的缩写。我希望这不会发生。我还需要将 fileAD.csv 分解为另外 2 个与类型对应的列的文件。
  • @Savas31 不鼓励更改要求,因为已经给出的答案需要更新..所以,我建议将问题恢复到以前的状态,但添加说明不需要匹配全名.. . 对于您的额外步骤,您应该能够从给出的答案中自己解决
  • @Sundeep,对不起,我没弄清楚这是怎么工作的……我是新来的。谢谢你的澄清。

标签: csv awk grep


【解决方案1】:

我选择只有一个 awk 实例的单行,没有临时文件:

awk -F ';' '{print >> "file" $2 ".csv"}' file1.csv

【讨论】:

  • 谢谢,这行得通。是否可以通过某种方式获得所有文件 fileAD.csv 、 fileADtype_1.csv 和 fileADtype_2.csv ?还是只是 fileADtype_1.csv 和 fileADtype_2.csv ?
  • 是的,这也是可能的,使用awk -F ';' '{print >> "file" $2 $6 ".csv"}' file1.csv,如果你想要两者合二为一,你可以通过这样做将它们结合起来:awk -F ';' '{print >> "file" $2 ".csv"; print >> "file" $2 $6 ".csv"}' file1.csv
  • 有没有办法指定输出文件的路径?在 'print >>' 之后写一条路径?
  • @Savas31:当然。只需发出print >> "path/to/file" $2 ".csv"
【解决方案2】:

作为一个班轮与awk:

for code in $(awk -F';' '{print $2}' data.csv | uniq); do awk -F';' -v pat="$code" '$2 ~ pat {print $0}' data.csv > "file${code}.csv"; done

【讨论】:

    猜你喜欢
    • 2017-06-23
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-08
    • 1970-01-01
    • 1970-01-01
    • 2022-07-25
    相关资源
    最近更新 更多