[英]How to use grep or awk to process a specific column ( with keywords from text file )
我嘗試了grep和awk命令的許多組合來處理文件中的文本。
這是此類型的客戶的列表:
John,Mills,81,Crescent,New York,NY,john@mills.com,19/02/1954
我正在嘗試將這些記錄分為兩類,即男士和女士。
我有一個列表,列出了約5000個女性名字,所有名字都是純文本,都在一個文件中。
如何“ grep”第一列(因為我只匹配名字),但仍打印整個客戶記錄?
我發現很容易“剪切”第一列和grep --file=female.names.txt
,但是這樣就不會再打印整個記錄了。
我知道awk選項,但是在那種情況下,我不知道如何從文件中讀取女性名字。
awk -F ',' ' { if($1==" ???Filename??? ") print $0} '
非常感謝 !
您可以使用Awk做到這一點:
awk -F, 'NR==FNR{a[$0]; next} ($1 in a)' female.names.txt file.csv
將打印csv文件的行,其中包含在female.names.txt
文件中找到的任何名字。
awk -F, 'NR==FNR{a[$0]; next} !($1 in a)' female.names.txt file.csv
將不會在female.names.txt
找到輸出行。
假設您female.names.txt
文件的格式類似於:
Heather
Irene
Jane
另一個選擇是Perl,如果您不太熟悉awk,則可以使用它。
#!/usr/bin/perl -anF,
use strict;
our %names;
BEGIN {
while (<ARGV>) {
chomp;
$names{$_} = 1;
}
}
print if $names{$F[0]};
要運行(假設您將此文件命名為filter.pl
):
perl filter.pl female.names.txt < records.txt
嘗試這個:
grep --file=<(sed 's/.*/^&,/' female.names.txt) datafile.csv
這會將女性名稱列表中的所有名稱更改為正則表達式^name,
因此它僅在行的開頭匹配,后跟逗號。 然后,它使用進程替換將其用作與數據文件匹配的文件。
因此,我提出了以下建議:
假設您有一個文件,該文件在名為test.txt
的文件中包含以下幾行:
abe 123 bdb 532
xyz 593 iau 591
現在,您要查找包含第一個字段的行,其中第一個和最后一個字母作為元音。 如果您執行了簡單的grep
,則將獲得兩行內容,但以下內容僅給出第一行,即所需的輸出:
egrep "^([0-z]{1,} ){0}[aeiou][0-z]+[aeiou]" test.txt
然后,您要查找包含第三個字段的行,第三個字段的第一個和最后一個字母為元音。 相似地,如果您執行了簡單的grep
,則將獲得兩行內容,但以下內容僅給出第二行,即所需的輸出:
egrep "^([0-z]{1,} ){2}[aeiou][0-z]+[aeiou]" test.txt
第一個花括號{1,}
指定根據ASCII表從0到z的前一個字符可以出現任意次。 之后, space in this case
,我們有字段分隔符space in this case
。 將第二個花括號{0} or {2}
的值更改為desired field number-1
。 然后,使用正則表達式提及您的條件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.