我有一个包含 400M 记录的文件。我正在尝试写出与 sctg2 = n 匹配的单个文件,其中 n = 1 到 43。scgt2 是第五列。示例 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,
克里希南
最佳答案
默认情况下,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 , '...'
关于regex - 尝试按 awk 中的特定列值打印行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21807313/