我尝试过很多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} '
非常感谢!
答案 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>
。然后,使用正则表达式来提及您的标准。