bash - 通过比较列中的值(使用 awk)打印 CSV 文件中的差异

标签 bash shell awk

假设我有 2 个文件 - file1.csvfile2.csv。我需要比较两个文件的第 2 列(字符串值)并打印出 file2.csv 中第 3 列的值的行,这些值不存在于 file1 的第 3 列中.csv

我试过使用以下 awk 命令:

awk -F'\t''NR==FNR{c[$3]++;next};c[$3] == 0' file1.csv file2.csv

然而,这只是给了我所有的 file2.csvfile2.csv 中只有 2 行不存在于 file1.csv 中。

谁能告诉我我做错了什么?

file1.csv 的片段(列从 0 开始编号)

ANR     26545   CallExpression                  mutex_unlock ( & mmc_test_lock )
ANR     26546   Callee                          mutex_unlock
ANR     26547   Identifier                      mutex_unlock
ANR     26548   ArgumentList                    & mmc_test_lock
ANR     26549   Argument                        & mmc_test_lock
ANR     26550   UnaryOperationExpression        & mmc_test_lock
ANR     26551   UnaryOperator                   &
ANR     26552   Identifier                      mmc_test_lock
ANR     26553   ExpressionStatement             "__free_pages ( test -> highmem , BUFFER_ORDER )"
ANR     26554   CallExpression                  "__free_pages ( test -> highmem , BUFFER_ORDER )" 
ANR     26555   Callee                          __free_pages 
ANR     26556   Identifier                      __free_pages
ANR     26557   ArgumentList                    test -> highmem
ANR     26558   Argument                        test -> highmem 
ANR     26559   PtrMemberAccess                 test -> highmem
ANR     26560   Identifier                      test
ANR     26561   Identifier                      highmem
ANR     26562   Argument                        BUFFER_ORDER
ANR     26563   Identifier                      BUFFER_ORDER 

file2.csv 的片段

ANR     12910   CallExpression                  mutex_unlock ( & mmc_test_lock )
ANR     12911   Callee                          mutex_unlock
ANR     12912   Identifier                      mutex_unlock
ANR     12913   ArgumentList                    & mmc_test_lock
ANR     12914   Argument                        & mmc_test_lock
ANR     12915   UnaryOperationExpression        & mmc_test_lock
ANR     12916   UnaryOperator                   & 
ANR     12917   Identifier                      mmc_test_lock 
ANR     12918   IfStatement                     if ( test -> highmem )
ANR     12919   Condition                       test -> highmem 
ANR     12920   PtrMemberAccess                 test -> highmem
ANR     12921   Identifier                      test
ANR     12922   Identifier                      highmem
ANR     12923   ExpressionStatement             "__free_pages ( test -> highmem , BUFFER_ORDER )"
ANR     12924   CallExpression                  "__free_pages ( test -> highmem , BUFFER_ORDER )" 
ANR     12925   Callee                          __free_pages
ANR     12926   Identifier                      __free_pages
ANR     12927   ArgumentList                    test -> highmem
ANR     12928   Argument                        test -> highmem
ANR     12929   PtrMemberAccess                 test -> highmem
ANR     12930   Identifier                      test
ANR     12931   Identifier                      highmem
ANR     12932   Argument                        BUFFER_ORDER
ANR     12933   Identifier                      BUFFER_ORDER

预期输出:

ANR     12918   IfStatement     if ( test -> highmem )
ANR     12919   Condition       test -> highmem 

最佳答案

您需要将 awk 命令更改为:

awk -F'\t' 'NR==FNR {seen[$2]; next} !($2 in seen)' file1.csv file2.csv

关于bash - 通过比较列中的值(使用 awk)打印 CSV 文件中的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43987883/

相关文章:

linux - 文件被复制并重命名,但我也收到错误

linux - 无法在 bash Linux 中为整数赋值

bash - 如何删除名称小于...的文件夹?

java - 从java程序内部执行linux命令

shell - 将 grep 过滤器的输出附加到文件

bash - 如何在 bash 中使用 AWK 添加 NUL 字符分隔符?

Bash:如果然后声明多个条件

bash - 寻找大文件的 uniq -c 替代品

bash - 对列中的字符进行计数和索引

python - 巨大的文本文件 (6Gb) 搜索和替换