我正在尝试将第X行中的值放在第5到第5 + Y行。我猜这是使用awk
快速完成此操作的方法。这是怎么做到的?
答案 0 :(得分:1)
我认为这对您有用,未经测试:
awk 'NR >= 5 && NR <= 5 + Y { print $X }' file.txt
显然,用X
和Y
代替一些真实值。
修改强>
如果X
和Y
是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
选项指定其他定界符。