【问题标题】:Shell script to read 2 files line by line and write common line to another file [closed]Shell脚本逐行读取2个文件并将公共行写入另一个文件[关闭]
【发布时间】:2015-05-29 09:42:34
【问题描述】:

file1.csv - 携带超过10万行的手机号码列表,格式如下;

447421475159,
447421475160,
447421475161,
447421475162,
447421475157,
447421475158,
447421475154,
447421475155,
447421475452,
447421475209,

file2.csv:携带大约1900个手机号码,格式同上。

我需要交叉检查两个文件之间的公共线并将其放入第三个文件中。

【问题讨论】:

  • 您似乎忘记在问题中包含问题。
  • 查看comm 命令

标签: shell unix


【解决方案1】:

使用 unix 命令comm,在两个已排序文件中查找公共行。由于您的文件未排序(从您的帖子来看),您还应该使用 sort 命令。一起使用:

comm -12 <( sort file1.csv ) <( sort file2.csv ) > outputFile

【讨论】:

  • 如果某个文件中的数字不是 uniq 怎么办,在这种情况下输出将无用
  • @vlp 这对我之前的回答是一个很好的评论,但它也是错误的,因为uniq 假定输入是排序的。我发现comm 更适合 OP 的需求。
【解决方案2】:

这个脚本

for i in `cat file2.csv`; do j=`grep $i file1.csv | wc -l`; if [[ $j -gt 0 ]]; then echo $i >> output.csv; fi; done

将从 file2.csv 中逐行获取所有数字,并将其与 file1.csv 进行比较。如果 file2.csv 中的数字至少有一次位于 file1.csv 中,则将其写入 output.csv。

【讨论】:

    【解决方案3】:

    试试这个

    cat file1.csv |grep -f file2.csv

    这会打印两个文件之间通用的所有手机号码

    抱歉忘记添加 -f 选项

    【讨论】:

    • 你试过这个吗?在我看来,您的脚本将尝试在 file1.csv 中找到 file2.csv 模式,而不是 file2.csv 的内容
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-24
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多