我正在尝试破译以下代码:
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
后跟一个符号会将符号指定为分隔符,但这里没有符号。我不理解这种情况下的默认行为。
发布于 2019-05-27 03:15:00
这是一个非常糟糕的命令行。
1)连字符是aws s3 cp
命令的一个选项。以这种方式使用它是不寻常的,但这意味着副本的目标是STDOUT,因此会被输送到gunzip
中。更常见的情况是,连字符表示通过管道传输到命令中的数据的STDIN。
2) print
正在输出aws s3 cp
命令以及管道的所有其余部分(包括另一个AWK命令的嵌入式实例)。
3)这里-F
的“符号”是使用(不正确地)Bash的翻译引号($" "
)的制表符。它应该使用Bash的ANSI引号($' '
),它允许解释反斜杠转义(\t
表示制表符)。在任何情况下,它都是浪费的,因为AWK可以理解-F
的\t
,而不需要任何特殊的引用。
这似乎是一个必须在其他地方设置的变量:output_path
外部AWK命令输出的管道需要馈送到shell才能执行。
https://stackoverflow.com/questions/56316203
复制相似问题