Bash 在shell中的两个可变子字符串之间剪切字符串

Bash 在shell中的两个可变子字符串之间剪切字符串,bash,shell,awk,Bash,Shell,Awk,我的文件名如下(省略实际名称) 我需要在filename_前缀和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='run

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

因为您仍然在
awk
脚本本身之外设置
RS
FS
,所以使用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
脚本本身之外设置
RS
FS
,所以使用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}'


然而,最后一个是不必要的间接。

RS
FS
的赋值是错误的。这里不能使用Awk变量;它们被简单地解释为静态字符串(这是唯一有意义的安排)


RS
FS
的赋值错误。这里不能使用Awk变量;它们被简单地解释为静态字符串(这是唯一有意义的安排)


您可以在
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

您可以在
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

非常感谢。工作得很有魅力。了解awk的工作,感谢您的帮助谢谢。工作得很有魅力。了解awk的工作,谢谢您的帮助