如何使用awk对txt中的数据进行分组?

如何使用awk对txt中的数据进行分组?,awk,grouping,Awk,Grouping,我有一组数据,如: firstname lastname state zipcode john doe oh 44110 jane doe ca 90210 john doe2 ca 90210 jane doe pa 19810 我的问题是如何使用AWK显示数据: firstname lastname state zipcode jane doe ca 90210

我有一组数据,如:

firstname lastname state zipcode
 john         doe   oh   44110
jane          doe   ca   90210
john          doe2  ca   90210
jane          doe   pa   19810
我的问题是如何使用AWK显示数据:

firstname lastname state zipcode
jane          doe   ca   90210
john          doe2  ca   90210
我想列出所有来自某个州、有特定邮政编码的人

我试过了

awk '{print $1, $2, $7(state)= "California", $8(zip)= "90210"}'
这将显示:

firstname lastname California 90210
 john     doe      california 90210
jane      doe      California 90210
James     doe      California 90210
而不是:

firstname lastname state zip
john     doe      California 90210
jane      doe      California 90210
James     doe      California 90210
试试这个:

awk 'NR==1||($3=="ca"&&$4==90210)' file
这将打印第一行,以及第三列为“ca”,第四列为90210的所有其他行。

尝试以下操作:

awk 'NR==1||($3=="ca"&&$4==90210)' file

这将打印第一行,以及第三列为“ca”,第四列为90210的所有其他行。

邮政编码已经包含状态信息,指定它是多余的

$ awk -v zip="90210" 'NR==1 || $NF==zip' file
我会给你

firstname lastname state zipcode
jane          doe   ca   90210
john          doe2  ca   90210
我想您也希望将显示从州代码更改为州名称

$ awk -v zip="90210" 'NR==1 || $NF==zip {sub(/ca/,"California",$3);print} ' file
firstname lastname state zipcode
jane doe California 90210
john doe2 California 90210
但是,间隔现在被打破了。您必须将输出文件分隔符更改为tab

$ awk -v zip="90210" -v OFS="\t" 'NR==1 || $NF==zip {sub(/ca/,"California",$3);print} ' states
firstname lastname state zipcode
jane    doe     California      90210
john    doe2    California      90210
差不多了,除了第一行。必须强制
awk
更换字段分隔符

$ awk -v zip="90210" -v OFS="\t" 'NR==1{$1=$1;print;next} $NF==zip {sub(/ca/,"California",$3);print} ' states
firstname       lastname        state   zipcode
jane    doe     California      90210
john    doe2    California      90210

邮政编码已经包含州信息,指定它是多余的

$ awk -v zip="90210" 'NR==1 || $NF==zip' file
我会给你

firstname lastname state zipcode
jane          doe   ca   90210
john          doe2  ca   90210
我想您也希望将显示从州代码更改为州名称

$ awk -v zip="90210" 'NR==1 || $NF==zip {sub(/ca/,"California",$3);print} ' file
firstname lastname state zipcode
jane doe California 90210
john doe2 California 90210
但是,间隔现在被打破了。您必须将输出文件分隔符更改为tab

$ awk -v zip="90210" -v OFS="\t" 'NR==1 || $NF==zip {sub(/ca/,"California",$3);print} ' states
firstname lastname state zipcode
jane    doe     California      90210
john    doe2    California      90210
差不多了,除了第一行。必须强制
awk
更换字段分隔符

$ awk -v zip="90210" -v OFS="\t" 'NR==1{$1=$1;print;next} $NF==zip {sub(/ca/,"California",$3);print} ' states
firstname       lastname        state   zipcode
jane    doe     California      90210
john    doe2    California      90210

如果要指定zip,则不需要指定state,这样就解决了将“California”映射到“ca”的问题。只要做:

$ awk -v zip="90210" '(NR==1) || ($4==zip)' file
firstname lastname state zipcode
jane          doe   ca   90210
john          doe2  ca   90210

如果要指定zip,则不需要指定state,这样就解决了将“California”映射到“ca”的问题。只要做:

$ awk -v zip="90210" '(NR==1) || ($4==zip)' file
firstname lastname state zipcode
jane          doe   ca   90210
john          doe2  ca   90210

这只返回标题,而不是实际的人名、状态或zipcode。很抱歉,我是这方面的初学者,或者可能我不太了解@user000001。如果第三个字段是“ca”,第四个字段是“90210”,那么将打印该行。再次检查您正在使用的示例,查看它是否与您在问题中发布的内容相匹配。这只返回标题,而不是实际的人名、状态或zipcode。很抱歉,我是这方面的初学者,或者可能我不太了解@user000001。如果第三个字段是“ca”,第四个字段是“90210”,那么将打印该行。再次检查您正在使用的示例,看看它是否与您在问题中发布的内容相匹配。数据集实际上非常庞大,有12个不同的列,但是我只需要第1、2、7和8列,即firstname、lastname、state和zip。我用上面的例子来说明数据是如何设置的,但是当我提交我尝试过的内容时,我忘记了将7和8更改为3和4,我理解并将在以后的文章中记住。这就是我想做的:显示居住在95111 zipcode中的us-500.csv中加利福尼亚人的列表?但是我被指示使用awk来找到答案。数据集实际上非常庞大,它有12个不同的列,但是我只需要第1、2、7和8列,即firstname、lastname、state和zip。我用上面的例子来说明数据是如何设置的,但是当我提交我尝试过的内容时,我忘记了将7和8更改为3和4,我理解并将在以后的文章中记住。这就是我想做的:显示居住在95111 zipcode中的us-500.csv中加利福尼亚人的列表?但是我被指示使用awk来找到答案。非常感谢,而且很简单。@TrinaJMoMoore很简单,但是如果将打印包含
ca
的行,那么如果有包含ca的名字或姓氏,也会打印出来,无论状态如何。非常感谢,它很简单。@TrinaJMoMoore很简单,但是if将打印包含
ca
的行,因此如果有包含ca的名字或姓氏,它也将被打印,无论状态如何。