linux - Bash 对 CSV 大文件进行排序并将输出排序到单独的文件

标签 linux bash sorting unix awk

我有一个大的(4GB)分号分隔文件(1.txt):

 - "3321";"<a href='/files/goods/edit/647/'><u>[ID 647]</u></a> Шорты";"2015-09-06 18:39:17";"1590";"1";"500";"";"Лейла";"878785";"Да";"80.140.1.38"
 - "2780";"<a href='/files/goods/edit/647/'><u>[ID 647]</u></a> Шорты";"2015-09-06 18:42:51";"1590";"1";"500";"";"Мара";"8664456";"Да";"46.00.00.2"
 - "3352";"<a href='/files/goods/edit/698/'><u>[ID 698]</u></a> Deck";"2015-09-06 19:05:42";"990";"1";"400";"";"Ed";"456452";"Нет";"80.26.00.00"
 - "3764";"<a href='/files/goods/edit/669/'><u>[ID 669]</u></a> Fish";"2015-09-06 18:36:18";"1390";"1";"530";"";"Ann";"545566";"Нет";"80.00.35.90"
 - "3323";"<a href='/files/goods/edit/669/'><u>[ID 669]</u></a> Fish";"2015-09-06 18:54:18";"1390";"1";"530";"";"юрий";"99393";"Да";"85.141.00.100"
 - "32763";"<a href='/files/goods/edit/430/'><u>[ID 430]</u></a> Radio";"2015-09-06

我需要按第二列对 1.txt 进行排序,并根据第二列名称将所有结果输出到单独的文件。

我这样做:

sed -r -i -e 's#"<a href=\x27\/files\/goods\/edit\/##g' 1.txt | sed -r -i -e 's#\/\x27>#;#g' 1.txt | sort --field-separator=';' --key=2 1.txt

但是现在如何拆分 1.txt 文件并将所有相同的 ID(第二列)值行放入单独的文件并计算文件中的记录数?拥有诸如 647_count.txt698_count.txt669_count.txt430_count.txt 之类的内容。 p>

最佳答案

尝试以下 awk 脚本(我们称之为 parser.awk):

BEGIN { FS=";"; }   # field separator
{ 
    if (match($2, /[0-9]+/)) {           # matching `ID` value
        m=substr($2, RSTART, RLENGTH);
        a[m]++;                          # accumulating number of lines for each `ID`
        print > m"_count.txt";    # writing lines pertaining to certain `ID` into respective file
    } 
}
END {
    for(i in a) { 
        print "mv "i"_count.txt "i"_"a[i]".txt"  # renaming files with actual counts
    }
} 

用法:

awk -f parser.awk 1.csv | sh

对于您在问题中发布的输入片段,我已获得以下文件列表:

430_1.txt 
647_2.txt 
669_2.txt
698_1.txt 

关于linux - Bash 对 CSV 大文件进行排序并将输出排序到单独的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42738361/

相关文章:

Python排序方法将两位数字字符串视为三位数字字符串

PHP:降序排序不起作用?

javascript - jQuery 数据表 : Sort on one column when clicking on another.

python - 从以用户身份运行的 python 脚本更改用户密码

linux - 在Linux中,日志输出产生后如何保存到文件中?

Bash - 根据特定行上的文本匹配删除奇数/偶数行

c - 为什么我在 netstat/ifconfig 中看不到服务器正在运行?

linux - Docker 容器可以在 Ubuntu 上运行,但无法在 MacOS 上运行

linux - 我正在创建一个内核模块来查找所有进程的驻留页面

node.js - 如何在 NodeJS 中生成一个新进程并将 stderr 重定向到 stdout?