如何使用grep或awk处理特定列(使用文本文件中的关键字)

时间:2014-08-08 01:11:25

标签: linux bash awk

我尝试过很多grep和awk命令的组合来处理文件中的文本。

这是此类客户的列表:

John,Mills,81,Crescent,New York,NY,john@mills.com,19/02/1954

我试图将这些记录分为两类,MEN和FEMALES。

我有一个大约5000个女性名字的列表,全部都是纯文本,全部在一个文件中。

我如何“grep”第一列(因为我只匹配名字)但仍打印整个客户记录?

我发现很容易“剪切”第一列和grep --file=female.names.txt,但这样就不会再打印整个记录了。

我知道awk选项但在那种情况下我不知道如何从文件中读取女性名字。

awk -F ',' ' { if($1==" ???Filename??? ") print $0} '

非常感谢!

4 个答案:

答案 0 :(得分:4)

您可以使用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

答案 1 :(得分:0)

另一种选择是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

答案 2 :(得分:0)

试试这个:

grep --file=<(sed 's/.*/^&,/' female.names.txt) datafile.csv

这会将女性名称列表中的所有名称更改为正则表达式^name,,因此它仅在行的开头匹配,后跟逗号。然后它使用进程替换将其用作与数据文件匹配的文件。

答案 3 :(得分:0)

所以,我想出了以下内容:

假设您有一个名为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,}

第一个花括号space in this case中的值指定前面的字符,根据ASCII表,范围从0到z,可以出现任意次。之后,我们有字段分隔符{0} or {2}。将第二个大括号desired field number-1中的值更改为<md-datepicker ng-model="myDate" md-placeholder="Enter date" md-min-date="minDate" md-max-date="maxDate"> </md-datepicker> 。然后,使用正则表达式来提及您的标准。