在shell中的两个变量子字符串之间剪切一个字符串

时间:2016-07-12 13:49:05

标签: bash shell awk

我的文件名如下(省略实际名称) 我需要在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

3 个答案:

答案 0 :(得分:1)

由于您仍然在RS脚本本身之外设置FSawk ,因此您使用的是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)

RSFS的分配是错误的。你不能在这里使用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