我的文件名如下(省略实际名称) 我需要在filename_prefix和runid之间提取文件名 这里的问题是文件名更改,长度为2-5个字段。 我一直在用这个
echo "filename_prefix_filename_filename_filename_runid_date_part-r-00020-c68fdc43-53bc-4aa9-a96b-2692ae2aa508.orc " | awk 'NR > 1 {print $1}' RS='filename_prefix' FS='runid'
这在命令行上工作正常,但我需要将RS和FS作为变量传递,我无法这样做,因为
echo of file name |awk -v file_p=$file_prefix -v r_id=_$RUN_ID 'NF > 1 {print $1}' RS=file_p FS=r_id
上述命令不起作用。
文件名:
filename_prefix_filename_filename_filename_runid_date_part-r-00020-c68fdc43-53bc-4aa9-a96b-2692ae2aa508.orc
filename_prefix_filename_filename_runid_date_part-r-00020-c68fdc43-53bc-4aa9-a96b-2692ae2aa508.orc
答案 0 :(得分:1)
由于您仍然在RS
脚本本身之外设置FS
和awk
,因此您使用的是shell变量,而不是awk
个变量。
... | awk 'NF > 1 {print $1}' RS="$file_prefix" FS="$RUN_ID"
或者,您可以使用
... | awk -v RS="$file_prefix" -v FS="$RUN_ID" 'NF > 1 {print $1}'
或
... | awk -v file_p="$file_prefix" -v runid="$RUN_ID" 'BEGIN{RS=file_p; FS=runid}; NF > 1 {print $1}'
但最后一个是不必要的间接。
答案 1 :(得分:1)
RS
和FS
的分配是错误的。你不能在这里使用Awk变量;它们被简单地解释为静态字符串(这是唯一有意义的安排)。
awk 'NF > 1 {print $1}' RS="$file_prefix" FS="_$RUN_ID"
答案 2 :(得分:1)
你可以在bash
中做同样的事情,虽然这是一个两步过程
$ f="filename_prefix_filename_filename_filename_runid_date_part-r-00020-c68fdc43-53bc-4aa9-a96b-2692ae2aa508.orc";
pre="filename_prefix_";
run="_runid*";
$ ff=${f%$run}; echo ${ff#$pre}
filename_filename_filename