2017-05-29 267 views
-2

我想通过使用AWK命令获取文件名的一部分。例如,我的文件名就像ABC_20100702001500.CSV。我想从我的文件名中得到YYYYMMDD格式来创建一个目录。我试过unix shell脚本错误

name=$(awk -F"." '{print $f}' | awk -F"_" '{print $NF}'). 

但是它显示错误就像意外标记`name = awk'附近的语法错误。我怎么能解决这个问题。请纠正我正确的语法。

+1

什么是'$ f'?一个shell变量?这在单引号内不起作用。第一个awk命令的输入在哪里?另外,您向我们展示的部分没有语法错误。相邻的线是什么? – Jens

+0

你有没有机会使用一些不能用'$(cmd)'替换命令的旧shell?然后使用反引号。 – Jens

+0

在您的代码上运行'shellcheck',如果您之后仍然有问题,请发布演示问题的[mcve]。你发布的内容确实包含一个语法错误(后面的'.'),并且还有其他问题,但没有任何内容会产生错误信息,就像你说的那样。如果您收到错误消息,请发布实际的错误消息,而不是“喜欢”它。 –

回答

0

你可能想单独在Bash中做到这一点。

考虑:

$ st="ABC_20100702001500.CSV" 

您可以使用参数扩展除去正面和背面部分:

$ tmp="${st#*_}" 
$ echo "${tmp%.*}" 
20100702001500 

或者,Bash有正则表达式的能力,以及:

$ [[ $st =~ ^[^_]*_([^.]+) ]] && echo ${BASH_REMATCH[1]} 
20100702001500 

或者,如果您有较旧的非Bash外壳,请使用sed

$ echo "$st" | sed -E 's/^[^_]*_//; s/\..*$//' 
20100702001500 
+0

虽然很好的建议,OP发布的代码不能产生错误消息,她说这样做试图修复或改进代码只会帮助解决她真正遇到的任何问题。 –

+1

@EdMorton:同意。在澄清之前,我认为入门技巧可能会有所帮助。 – dawg