![](/img/trans.png)
[英]Select rows in a CSV not matching any pattern in pattern file in GNU Linux (AWK/SED/GREP)
[英]Matching third field in a CSV with pattern file in GNU Linux (AWK/SED/GREP)
當第三個字段與模式文件中的模式匹配時,我需要打印CSV文件中的所有行。
我嘗試過grep時沒有碰運氣,因為它與任何字段都匹配,而不僅僅是第三個。
grep -f FILE2 FILE1 > OUTPUT
文件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
文件2
00567
98745
45486
54543
48349
96349
56485
19615
56496
39493
正確的輸出
dasdas,0,00567,1,lkjiou,85249
sadsad,0,98745,1,gfdkjh,45346
錯誤的輸出
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
我已經搜索了各處,並嘗試了不同的公式。
編輯:感謝Wintermute,我設法寫了這樣的東西:
csvquote file1.csv > file1.csv
awk -F '"' 'FNR == NR { patterns[$0] = 1; next } patterns[$6]' file2.csv file1.csv | csvquote -u > result.csv
Csvquote幫助使用AWK解析CSV文件。
非常感謝大家,偉大的社區!
使用awk:
awk -F, 'FNR == NR { patterns[$0] = 1; next } patterns[$3]' file2 file1
其工作原理如下:
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.
使用grep
和sed
:
grep -f <( sed -e 's/^\|$/,/g' file2) file1
dasdas,0,00567,1,lkjiou,85249
sadsad,0,98745,1,gfdkjh,45346
說明:
我們在文件2的開頭和結尾插入一個逗號,但是不更改文件,那么就像您已經做的那樣,我們只是grep。
這可以是一個開始
對於$(cat FILE2)中的i;執行cat FILE1 | cut -d','-f3 | grep $ i;完成
sed 's#.*#/^[^,]*,[^,]*,&,/!d#' File2 >/tmp/File2.sed && sed -f /tmp/File2.sed FILE1;rm /tmp/File2.sed
像awk一樣可以在簡單的sed中完成,但是如果awk不可用,則應該可以工作
與egrep相同(在大文件上使用usefull)
sed 's#.*#^[^,]*,[^,]*,&,#' File2 >/tmp/File2.egrep && egrep -f /tmp/File2.egrep FILE1;rm /tmp/File2.egrep
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.