2012-09-17 91 views

回答

1

我认为这会为你工作,未经测试:

awk 'NR >= 5 && NR <= 5 + Y { print $X }' file.txt 

显然,替代XY一些真正的价值。

编辑:

如果XY是shell变量:

awk -v column="$X" -v range="$Y" 'NR >= 5 && NR <= 5 + range { print $column }' file.txt 
+0

为'-F'分隔符添加一个参数,就完成了!:) –

+0

只是将它们拼凑在一起(假设'X列'表示第X行字符):'awk -v FS ='''NR> = 5 && NR <= 5 +'$ Y'{print $'$ X'}'file.txt'。请注意,shell变量直接拼接到awk语句中。还好奇地注意到(至少在OS X 10.8.1上),不能通过-F选项指定_empty_字段分隔符,因此通过'-v'定义。 – mklement0

+0

@mklement:你应该假定一列是_field_,而不是行上的_Nth_字符。虽然你可以用简单的shell变量来打破awk语句,但是在使用它们之前分配它们通常会更清晰。它也可以帮助减少重复的代码。 – Steve

0

如果“列”你的意思是你有,比如说,用逗号分隔的字段的文件,你想提取一个特定的领域,接受的答案很好地做到了。回顾一下,

awk -F , 'NR==5 { print $6 }' file 

从逗号分隔文件中第5行提取第六个字段。如果您的分隔符不是逗号,请将其他参数作为参数传递给-F选项。 (用GNU awk中,你可以通过一个正则表达式来-F指定相当复杂的列分隔符,但如果你需要的是,去找到那个特定的情况下一个更具体的问题。)

如果“列”你的意思是一个固定的字符在一行内的位置,substr功能就是这样做的。

awk 'NR == 5 { print substr($0, 6) }' file 

打印第六列及其后的所有内容。如果要限制到一个固定的宽度,

awk 'NR == 5 { print substr($0, 6, 7) }' file 

打印七个字符起始于偏移6(awk中索引从1开始,所以偏移1是线路上的第一个字符)上线5.如果你不知道到底有多少字符将被提取,但你想一个数字,用awk方便地让你从一个字符串的开始提取号码:

awk 'NR == 5 { print 0 + substr($0, 6, 7) }' file 

将提取相同的7个字符,但随后强迫的结果到号码,有效地修剪任何非数字后缀,并打印。

在最一般的情况下,您可能需要对已提取的值执行进一步拆分。

awk 'NR == 5 { split(substr($0, 6), a, /:/); print a[1] }' file 

将在正则表达式/:/(在这个简单例子中,正则表达式匹配简单地文字冒号)分裂所提取的子到阵列a。然后,我们打印第一个元素a,这意味着我们将所有从子索引中的第一个冒号开始的所有内容从索引6开始并延伸到行号5的行尾。

(为了让您免受要查看它,$0是整个当前的输入行,awk逐行处理一个文件,依次在每行上运行脚本的主体,如果需要将shell变量暴露给awk,awk -v awkvariable="$shellvariable"就是这样做的。)