Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 通过比较列中的值打印CSV文件中的差异(使用awk)_Bash_Shell_Awk - Fatal编程技术网

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

Bash 通过比较列中的值打印CSV文件中的差异(使用awk),bash,shell,awk,Bash,Shell,Awk,假设我有两个文件-file1.csv和file2.csv。我需要比较两个文件的第2列(字符串值),并打印出file2.csv中的行,以获取file1.csv的第3列中不存在的第3列值 我已尝试使用以下awk命令: awk -F'\t''NR==FNR{c[$3]++;next};c[$3] == 0' file1.csv file2.csv 然而,这只是给了我所有的file2.csv。file2.csv中只有两个额外的行不在file1.csv中 有人能告诉我我做错了什么吗 file1.csv的

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

我已尝试使用以下
awk
命令:

awk -F'\t''NR==FNR{c[$3]++;next};c[$3] == 0' file1.csv file2.csv
然而,这只是给了我所有的
file2.csv
file2.csv
中只有两个额外的行不在
file1.csv

有人能告诉我我做错了什么吗

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

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

非常感谢你回答我的问题!但是,这也不起作用。在这种情况下,您需要发布来自2个csv文件的样本数据和预期输出。文件2中的第2列都是
12…
,但在文件1中,您拥有所有
26…
,因此当然没有匹配。我道歉,这里的另一位用户更正了我。我假设列从0开始编号。然而,使用c[$3]只会给我一个空白文件。我已经相应地编辑了这个问题。这很有效!非常感谢你!我真的很感激!您必须在awk中执行此操作吗?如果没有,请查看
diff
。请随预期输出一起发布一些示例数据。第二列中没有一列与其他文件匹配…列从0开始编号。@AnnaR不,它们不是。
awk -F'\t' 'NR==FNR {seen[$2]; next} !($2 in seen)' file1.csv file2.csv