我是bash脚本的新手,需要以下问题的帮助。我解析了一个日志文件以进入下面,现在卡在后面的部分。 我有一个文件1.csv内容为:
mac-test-1,10.32.9.12,15
mac-test-2,10.32.9.13,10
mac-test-3,10.32.9.14,11
mac-test-4,10.32.9.15,13
第二个文件2.csv包含以下内容:
mac-test-3,10.32.9.14
mac-test-4,10.32.9.15
我想进行文件比较,如果第二个文件中的行与第一个文件中的任何行匹配,则更改文件 1 的内容,如下所示:
mac-test-1,10.32.9.12, 15, no match
mac-test-2,10.32.9.13, 10, no match
mac-test-3,10.32.9.14, 11, matched
mac-test-4,10.32.9.15, 13, matched
我试过这个
awk -F "," 'NR==FNR{a[$1]; next} $1 in a {print $0",""matched"}' file2.csv file1.csv
但它打印在下面,不包括不匹配的记录
mac-test-3,10.32.9.14,11,matched
mac-test-4,10.32.9.15,13,matched
此外,在某些情况下,file2 可以为空,因此结果应如下所示:
mac-test-1,10.32.9.12,15, no match
mac-test-2,10.32.9.13,10, no match
mac-test-3,10.32.9.14,11, no match
mac-test-4,10.32.9.15,13, no match
使用您显示的示例,请尝试以下awk
代码。您不需要先检查条件,然后再打印语句,因为当您检查$1 in a
时,那些不存在的项目将永远不会进入此条件的块。所以最好打印整条生产线file1.csv
,然后根据其在数组中的存在打印该特定行的匹配或不匹配状态。
awk '
BEGIN { FS=OFS="," }
FNR==NR{
arr[$0]
next
}
{
print $0,(($1 OFS $2) in arr)?"Matched":"Not-matched"
}
' file2.csv file1.csv
>EDIT:在这里添加一个解决方案来处理 file2.csv 场景的空文件,与上述概念相同,它只处理 file2.csv 是空文件时的场景。
awk -v lines=$(wc -l < file2.csv) '
BEGIN { FS=OFS=","}
(lines==0){
print $0,"Not-Matched"
next
}
FNR==NR{
arr[$0]
next
}
{
print $0,(($1 OFS $2) in arr)?"Matched":"Not-matched"
}
' file2.csv file1.csv
您没有打印其他大小写:
awk -F "," 'NR==FNR{a[$1]; next}
{
if ($1 in a) {
print $0 ",matched"
} else {
print $0 ",no match"
}
}' file2.csv file1.csv
输出
mac-test-1,10.32.9.12,15,no match
mac-test-2,10.32.9.13,10,no match
mac-test-3,10.32.9.14,11,matched
mac-test-4,10.32.9.15,13,matched
或者简而言之,无需手动打印逗号,而是使用 OFS:
awk 'BEGIN{FS=OFS=","} NR==FNR{a[$1];next}{ print $0 OFS (($1 in a)?"":"no")"match"}' file2.csv file1.csv
编辑
我在此页面上找到了一个解决方案,在空文件上处理 FNR==NR。
当 file2.csv 为空时,所有输出行将为:
mac-test-1,10.32.9.12,15,no match
例
awk -F "," '
ARGV[1] == FILENAME{a[$1];next}
{
if ($1 in a) {
print $0 ",matched"
} else {
print $0 ",no match"
}
}' file2.csv file1.csv
@RavinderSingh13和@Thefourthbird的每个答案都包含解决方案的大部分内容,但在这里它们都在一起:
awk '
BEGIN { FS=OFS="," }
{ key = $1 FS $2 }
FILENAME == ARGV[1] {
arr[key]
next
}
{
print $0, ( key in arr ? "matched" : "no match")
}
' file2.csv file1.csv
或者如果您愿意:
awk '
BEGIN { FS=OFS="," }
{ key = $1 FS $2 }
!f {
arr[key]
next
}
{
print $0, ( key in arr ? "matched" : "no match")
}
' file2.csv f=1 file1.csv