我正在尝试使用 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 现在正在扩展变量,因此您需要转义第一个变量,
$
以便将其传递给 shellawk
,而不是由 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'}')"