Car*_*s F 1 linux bash awk grep sed
当第三个字段与模式文件中的模式匹配时,我需要打印CSV文件中的所有行。
我尝试过grep时没有碰运气,因为它与任何字段都匹配,而不仅仅是第三个字段。
grep -f FILE2 FILE1 > OUTPUT
Run Code Online (Sandbox Code Playgroud)
文件1
dasdas,0,00567,1,lkjiou,85249
sadsad,1,52874,0,lkjiou,00567
asdasd,0,85249,1,lkjiou,52874
dasdas,1,48555,0,gfdkjh,06793
sadsad,0,98745,1,gfdkjh,45346
asdasd,1,56321,0,gfdkjh,47832
Run Code Online (Sandbox Code Playgroud)
文件2
00567
98745
45486
54543
48349
96349
56485
19615
56496
39493
Run Code Online (Sandbox Code Playgroud)
正确的输出
dasdas,0,00567,1,lkjiou,85249
sadsad,0,98745,1,gfdkjh,45346
Run Code Online (Sandbox Code Playgroud)
错误的输出
dasdas,0,00567,1,lkjiou,85249
sadsad,1,52874,0,lkjiou,00567 <---- I don't want this to appear
sadsad,0,98745,1,gfdkjh,45346
Run Code Online (Sandbox Code Playgroud)
我已经搜索了各处,并尝试了不同的公式。
编辑:感谢Wintermute,我设法写了这样的东西:
csvquote file1.csv > file1.csv
awk -F '"' 'FNR == NR { patterns[$0] = 1; next } patterns[$6]' file2.csv file1.csv | csvquote -u > result.csv
Run Code Online (Sandbox Code Playgroud)
Csvquote帮助使用AWK解析CSV文件。
非常感谢大家,伟大的社区!
使用awk:
awk -F, 'FNR == NR { patterns[$0] = 1; next } patterns[$3]' file2 file1
Run Code Online (Sandbox Code Playgroud)
其工作原理如下:
FNR == NR { # when processing the first file (the pattern file)
patterns[$0] = 1 # remember the patterns
next # and do nothing else
}
patterns[$3] # after that, select lines whose third field
# has been seen in the patterns.
Run Code Online (Sandbox Code Playgroud)