尝试按awk中的特定列值打印行

时间:2014-02-16 04:32:16

标签: regex select awk

我有一个包含400M记录的文件。我试图写出单个文件,如果它们匹配sctg2 = n,其中n = 1到43. scgt2是第5列。此处提供了示例CSV文件(samplef.csv)http://goo.gl/if85vJ

ofips, dfips, ofaf, dfaf, sctg2, tons, value
1001,1001,1,1,1,10,20
1001,1002,1,1,1,20,30
1001,1003,1,1,1,30,40
1001,1004,1,1,1,40,50
1001,1001,1,1,2,110,20
1001,1002,1,1,2,120,30
1001,1003,1,1,2,130,40
1001,1004,1,1,2,140,50
1001,1001,1,1,3,210,20
1001,1002,1,1,3,220,30
1001,1003,1,1,3,230,40
1001,1004,1,1,3,240,50

我使用了awk(Windows 7),我尝试了以下表达式,它只会选择sctg2 = 2的所有记录(所有记录都将输出作为空文件):

gawk '$5 == 2 {print $1, $2, $6, $7}' samplef.csv > sampleout.csv
gawk '$5 ~ /2/ {print $1, $2, $6, $7}' samplef.csv > sampleout.csv

预期输出(sampleout.csv)是:

ofips, dfips, tons, value
1001,1001,110,20
1001,1002,120,30
1001,1003,130,40
1001,1004,140,50

任何帮助都表示赞赏,因为我不确定我在这里做错了什么,而且我的智慧结束了。它是CSV还是正则表达式数字这一事实对此有何影响?

TIA,

克里希南

2 个答案:

答案 0 :(得分:3)

默认情况下,awk使用空格分隔 列。如果您想使用逗号,请尝试:

gawk '$5 == 2 {print $1, $2, $6, $7}' FS=, samplef.csv > sampleout.csv

FS是字段分隔符,将其设置为逗号应该可以执行您想要的操作。有几种设置值的技术,以下各项是等效的。 (这些与上面显示的形式之间存在细微差别,但这些差异与此特定示例无关。)

awk -v FS=, '$5 == 2 {print $1, $2, $6, $7}'
awk 'BEGIN{FS=","} $5 == 2 {print $1, $2, $6, $7}'
awk -F , '...'

答案 1 :(得分:0)

这是另一种方式:

awk -F, 'NR==1||NR>1&&$5==2{print $1,$2,$6,$7}' OFS=, file

使用您的文件输出

$ awk -F, 'NR==1||NR>1&&$5==2{print $1,$2,$6,$7}' OFS=, file
ofips, dfips, tons, value
1001,1001,110,20
1001,1002,120,30
1001,1003,130,40
1001,1004,140,50