簡體   English   中英

如何使用grep或awk處理特定列(帶有文本文件中的關鍵字)

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

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