我正在尝试破译以下代码:
awk '{print "aws s3 cp ###"$4" - | gunzip | awk -F $\"\\t\" '"'"'BEGIN {OFS = FS} {if ($287 == \"0\" && tolower($295)) print $11}'"'"' > "gensub(/.+\/(.+tsv\.gz)/,output_path"\\1.txt",$4)}'
但是,我不确定一些事情:
1) "-"的作用。我知道“|”用于管道,但我真的不确定“-”,除非在否定某些选项的情况下。我尝试用谷歌搜索“ubuntu hyphen/minus/dash”,但没有找到与此相关的内容
2) 我也不确定 print "aws s3 cp ###"$4"
。它通常会打印满足 if 条件的行,但这里它需要一个 aws 命令字符串,后面是我知道 $4 是一个列索引
3) 另外,我知道 awk -F
后跟一个符号会将符号指定为分隔符,但这里没有符号。我不明白这种情况下的默认行为。
最佳答案
那真是一个糟糕的命令行。
1) 连字符是 aws s3 cp
命令的一个选项。以这种方式使用它并不常见,但这意味着副本的目标是 STDOUT,因此通过管道传输到 gunzip
。更常见的是连字符代表 STDIN,用于将数据通过管道输入命令。
2) print
正在输出 aws s3 cp
命令以及管道的所有其余部分(包括另一个 AWK 命令的嵌入式实例)。
3) 此处 -F
的“符号”是制表符(不正确地)使用 Bash 的翻译引号 ($""
)。它应该使用 Bash 的 ANSI 引号 ($' '
),它允许解释反斜杠转义(\t
表示制表符)。无论如何,这都是浪费,因为 AWK 无需任何特殊引用即可理解 \t
for -F
。
这似乎是一个必须在别处设置的变量:output_path
外部 AWK 命令输出的管道需要提供给 shell 才能执行。
关于linux - bash 中的连字符和垂直线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56316203/