繁体   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