簡體   English   中英

在GNU Linux(AWK / SED / GREP)中將CSV中的第三字段與模式文件匹配

[英]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.

使用grepsed

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM