awk病房问题

awk病房问题

我正在尝试使用 awk 从字符串中提取一些不同的字段。

例子:

selected="a2.flac|a3.flac|a4.flac"
first_file=$(echo "$selected" | awk -F'|' '{print $1}')

上面的代码返回 a2.flac 这是我所期望的。但现在,我想迭代一个变量并一次取出一个文件。所以我尝试了这个:

i=1
first_file=$(echo "$selected" | awk -F'|' '{print $i}')

我以为这会拉出第一个文件......但没有任何返回。所以我接下来尝试了这个:

i=1
first_file=$(echo "$selected" | awk -F'|' '{print \$i}')

这也行不通。我也尝试过这个方法:

i=1
first_file=$(echo "$selected" | awk -F'|' n=$i '{print $n}')

并且还尝试了这个:

i=1
first_file=$(echo "$selected" | awk -v -F'|' n=$i '{print $n}')

我尝试过的一切似乎都不起作用。我不知道什么有用。

答案1

$i是一个 shell 变量,awk无法访问它,因此$i计算结果为空。您可以 i) 对awk脚本使用 double qupted,以便 shell 在将其传递给awk执行之前扩展其中的变量,或者 ii) 将其awk作为awk变量传递:

  • 使用双引号。请注意,由于 shell 现在正在扩展变量,因此您需要转义第一个变量,$以便将其传递给 shell awk,而不是由 shell 解释:

    $ i=1
    $ first_file=$(echo "$selected" | awk -F'|' "{print \$$n}")
    $ echo "$first_file"
    a2.flac
    
  • 将变量传递给awk.你有语法几乎正确的:

    $ first_file=$(echo "$selected" | awk -F'|' -vi="$i" '{print $i}')
    $ echo "$first_file"
    a2.flac
    

答案2

你快成功了

i=1
first_file=$(echo "$selected" | awk -v n="$i" -F'|'  '{print $n}')
  • 使用 -v name=value 设置变量

答案3

$i 的值由 shell 设置,为了能够做到这一点,字符串必须是双引号或不带引号的。因此,你的行:

i=1; first_file=$(echo "$selected" | awk -F'|' '{print $i}')     # original
i=1; first_file=$(echo "$selected" | awk -F'|' '{print $'$i'}')  # un-quoted
i=1; first_file=$(echo "$selected" | awk -F'|' '{print $'"$i"'}') # double-quoted
i=1; first_file=$(echo "$selected" | awk -F'|' "{print \$$i}")  # full double-quoted

当然,您可以并且是最正确的方法,告诉 awk var 的值是什么,然后使用它(我使用 jj 来明确变量名称的差异):

i=1; first_file=$(echo "$selected" | awk -F'|' -v jj="$i" '{print $jj}') 

也许更惯用的方法是(由于管道“|”而没有子外壳):

i=1; first_file="$( <<<"$selected" awk -F\| '{print $'$i'}')"

相关内容