【问题标题】:Find strings from one file that are not in lines of another file从一个文件中查找不在另一个文件行中的字符串
【发布时间】:2023-03-18 07:01:01
【问题描述】:

在 bash shell 脚本中,我需要使用文件 1 中的字符串创建一个文件,这些字符串在文件 2 的行中找不到。文件 1 通过目录中文件的 for 循环打开。

files=./Output/*
for f in $files
do

done 

我有非常大的文件,所以使用 grep 并不理想。我之前试过:

awk 'NR==FNR{A[$2]=$0;next}!($2 in A){print }' file2 file1 > file3

文件 1:

NB551674:136:HHVMJAFX2:1:11101:18246:1165
NB551674:136:HHVMJAFX2:1:11101:10296:1192
NB551674:136:HHVMJAFX2:1:11101:13281:1192
NB551674:136:HHVMJAFX2:2:21204:11743:6409

文件 2:

aggggcgttccgcagtcgacaagggctgaaaaa|AbaeA1    NB551674:136:HHVMJAFX2:2:21204:11743:6409   100.000 32  0   0   1   32  83  114 7.30e-10    60.2 
taccaacaattcagcgttacgccaacggtaac|AbaeB1 NB551674:136:HHVMJAFX2:4:21611:6341:1845    100.000 32  0   0   1   32  27  58  6.70e-10    60.2 
taccaacaattcagcgttacgccaacggtaac|AbaeB1 NB551674:136:HHVMJAFX2:4:11504:1547:13124   100.000 32  0   0   1   32  88  119 6.70e-10    60.2 
taccaacaattcagcgttacgccaacggtaac|AbaeB1 NB551674:136:HHVMJAFX2:3:11410:11337:15451  100.000 32  0   0   1   32  27  58  6.70e-10    60.2

预期输出:

NB551674:136:HHVMJAFX2:2:21204:11743:6409

【问题讨论】:

  • 我们鼓励提问者展示他们迄今为止为自己解决问题所做的尝试。
  • 如果 file1 中的某些行与 file2 中的某些行匹配并且您显示了预期的输出,那么您的示例会更有用。

标签: string awk


【解决方案1】:

您很接近 - file1 只有 1 个字段 ($1),但您试图在哈希查找中使用 $2 ($2 in A)。改为这样做:

$ awk 'NR==FNR{a[$2]; next} !($1 in a)' file2 file1
NB551674:136:HHVMJAFX2:1:11101:18246:1165
NB551674:136:HHVMJAFX2:1:11101:10296:1192
NB551674:136:HHVMJAFX2:1:11101:13281:1192

不要在 awk 或 shell btw 中对用户定义的变量名使用全部大写,以避免与内置变量和其他原因发生冲突。

【讨论】:

    【解决方案2】:

    使用comm,这需要对文件进行排序。使用 Perl 单行(或 cut)打印 file2 的第二个字段:

    comm -23 <(sort file1) <(perl -lane 'print $F[1]' file2 | sort)
    

    【讨论】:

      【解决方案3】:

      不要这样左一行比较右一行。

      在字节模式下使用 gawk,或者最好使用 mawk,将文件 1 中的每一行预加载到数组中。直接使用字符串作为数组的哈希索引,而不仅仅是数字 1,2,3....

      并将 FS 设置为与 ORS 相同(以防止它不必要地尝试处理要拆分字段的字符串)。

      关闭文件1,打开文件2,然后使用文件2中的每一个字符串,并删除数组中对应的条目。

      关闭文件 2。

      在 END 部分,打印出该数组中剩余的任何内容。那是你的一套。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-06
        • 2019-03-21
        • 2017-03-05
        • 1970-01-01
        • 1970-01-01
        • 2023-01-16
        • 2020-10-08
        相关资源
        最近更新 更多