bash - 如何使用最后一个字段作为变量从 bash 调用 awk
问题描述
假设我有一个名为 input.csv 的 CSV 输入文件:
1,2,3,valueIWantToPrint
3,5,2,valueIWantToPrint
我目前需要使用 awk 打印该输入的每一行的最后一个元素,这可以通过字段分隔符和 NF 变量轻松完成:
awk -F"," '{print $NF}' input.csv
但是现在假设我想让我想打印一个变量的字段,因为稍后输入格式可能会改变并且它将是一个不同的字段。
输入文件:
1,2,valueIWantToPrint,3
3,5,valueIWantToPrint,2
脚本:
FIELD_TO_PRINT=3
awk -F"," -v fieldToPrint=FIELD_TO_PRINT '{print $fieldToPrint}' input.csv
好的,这很容易。但是现在为了使其尽可能灵活,我希望能够将 FIELD_TO_PRINT 设置为 NF 的等价物,这样我就可以打印最后一个值,而不管字段数如何。我所追求的是这样的:
输入:
1,2,3,7,2,5,23,1,3,6,valueIWantToPrint
3,5,2,6,3,valueIWantToPrint
该脚本不起作用,但说明了我要完成的工作:
FIELD_TO_PRINT=NF
awk -F"," -v fieldToPrint=FIELD_TO_PRINT '{print $fieldToPrint}' input.csv
有没有一种方便的方法可以将变量设置为“记录中的最后一个字段”?这个例子很简单,但最终 FIELD_TO_PRINT 变量将放在一个单独的配置文件中,并且 awk 脚本会更大更复杂。因此,有一个好的方法来实现这一点将非常有用。
解决方案
你可以使用这个技巧
$ awk -F, -v n=-1 '{print (n<0)?$(NF+n+1):$n}' file
valueIWantToPrint
valueIWantToPrint
假设负索引从 NF 开始向后计数,所以 -2 将意味着倒数第二个字段等。
推荐阅读
- python - 列表中具有相同实例数的 Python 最大值
- html - 如何在手机和平板电脑上制作一个旋转木马,在扩展 md 时消失
- php - 使用多个参数搜索,LIKE、ORDER BY
- python - (Numpy C API)迭代单个数组:NpyIter 与 for 循环(使用 PyArray_DATA)
- ruby-on-rails - 如何在 Rails 5 中验证相同操作的不同 ActiveRecord
- javascript - 反斜杠拆分合并拆分元素
- java - 使用 Jackson 将 XML 转换为 Map,Key 应为小写
- c++ - Poco DateTimeFormatter - 使用当前时区打印时间戳
- css - CSS 直接后代在生产构建中无法正常工作
- django - 获取 http://dl-cdn.alpinelinux.org/alpine/v3.8/main/x86_64/APKINDEX.tar.gz 总是失败