shell - awk 语法 — 什么是 OFS?为什么末尾有 1?

标签 shell awk

awk -F"\t" -v OFS="\t" '{if($18~/^ *[0-9]*(\.[0-9]+)?" *$/)sub(/"/,"",$18);else $18=" "}1' sample.txt

上面的代码是我正在修改的脚本中使用的一些awk代码。我是 Unix 新手,所以无法理解上述 awk 的语法。

  • -F 用于使用分隔符分割列。
  • OFS 是什么?
  • awk 脚本末尾的 1 有什么用?

最佳答案

-v OFS="\n" 将名为 OFS 的参数从 shell 传递到 awk 脚本。与 -F 选项或 FS 类似,它是字段分隔符 - 但用于输出。它称为输出字段分隔符

你可以测试一下:

awk -v OFS=' ' '{print 1,2}' a.txt

输出以空格分隔:

1 2
1 2

.

awk -v OFS=';' '{print 1,2}' a.txt

输出由;分隔:

1;2
1;2

在您的情况下,这意味着输出将由制表符分隔(作为输入)


awk 脚本末尾的 1,让 awk 除了脚本生成的输出之外还打印原始输入行。这是因为 awk 脚本通常包含测试(正则表达式等)和它们的操作。测试 1 将始终为真。由于 awk 的默认操作是打印当前行,因此它将打印该行

关于shell - awk 语法 — 什么是 OFS?为什么末尾有 1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16903005/

相关文章:

awk - 管道上的 fflush 在 awk 中不起作用

bash - 在 bash 命令输出中添加前缀

shell - 在与获取另一个脚本的同一行上定义 shell 脚本变量

linux - 我可以在 awk 的不同代码块中使用不同的分隔符吗?

linux - 搜索以特定扩展名结尾的数据类型的递归文件,以便删除文件

php - 转义冗长的 Bash 命令以与 PHP exec() 一起使用

linux - 添加双引号、逗号和删除换行符

bash - 转义以防止正确的 shell 注入(inject)

bash - sed/awk - 如何删除少于 3 列的行

awk 定义之前使用的变量来确定最长的行