bash命令用于在特定行号范围内打印列

时间:2012-09-17 01:55:55

标签: bash awk

我正在尝试将第X行中的值放在第5到第5 + Y行。我猜这是使用awk快速完成此操作的方法。这是怎么做到的?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

如果是&#34;列&#34;你的意思是你有一个文件,比如逗号分隔的字段,你想要提取一个特定的字段,接受的答案很好地做到了。回顾一下,

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

从逗号分隔文件中的第5行中提取第六个字段。如果您的分隔符不是逗号,请将其他内容作为参数传递给-F选项。 (使用GNU Awk,您可以将正则表达式传递给-F以指定相当复杂的列分隔符,但如果您需要,请找到有关该特定方案的更具体的问题。)

如果是&#34;列&#34;你的意思是一行中的固定字符位置,substr函数就是这样做的。

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

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

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

在第5行打印7个字符,从偏移6开始(Awk索引从1开始,因此偏移1是该行的第一个字符)。如果你不确切知道要提取多少个字符,但你想要一个数字,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"就是这样做。)

答案 2 :(得分:0)

使用awk打印第5至10行的第2列:

awk 'NR==5,NR==10 {print $2}' <file                           # white space delim. columns
awk 'NR==5,NR==10 {print $2}; NR==10 {exit}' <file            # optimized
awk -F: 'NR==5,NR==10 {print $2}; NR==10 {exit}' </etc/passwd # colon delimited columns

优化是它在所需范围的最后一行打印完后退出。

使用了范围模式

范围模式由两个用逗号分隔的模式组成,格式为“ begpat,endpat”。它用于匹配连续输入记录的范围。
https://www.gnu.org/software/gawk/manual/html_node/Ranges.html

模式可以是 regexp模式表达模式。上面使用表达模式与NR进行比较。

我假设使用空格分隔列,但是提供了一个示例,该示例使用-F选项指定其他定界符。