如何在awk中使用路径变量?

时间:2017-02-23 17:08:34

标签: awk

  

当我为输出文件“print>”/tmp/outputfile.txt"nfile}'“提供绝对路径时,下面命令分割文件工作正常:

awk -v size=$(wc -l < inputfile.txt) -v perc=0.2 '{nfile = int(NR/(size*perc)); if(nfile >= 1/perc){nfile--;  } print > "/tmp/outputfile.txt"nfile}' inputfile.txt
  

但是当我用变量删除绝对路径时它不起作用,我   尝试过以下命令 -

printenv |grep tempdir
tempdir=/tmp

 awk -v size=$(wc -l < inputfile.txt) -v perc=0.2 '{nfile = int(NR/(size*perc)); if(nfile >= 1/perc){nfile--;  } print > ENVIRON["tempdir"]"outputfile.txt"nfile}' inputfile.txt
awk -v size=$(wc -l < inputfile.txt) -v perc=0.2 -v tempdir="/tmp" '{nfile = int(NR/(size*perc)); if(nfile >= 1/perc){nfile--;  } print > "tempdir/outputfile.txt"nfile}' inputfile.txt
awk -v size=$(wc -l < inputfile.txt) -v perc=0.2 '{nfile = int(NR/(size*perc)); if(nfile >= 1/perc){nfile--;  } print > "$tempdir/outputfile.txt"nfile}' inputfile.txt

3 个答案:

答案 0 :(得分:1)

ENVIRON仅适用于在命令行上导出或设置的变量。在任何情况下,只需使用-v使用相同名称的shell变量的值初始化名为tempdir的awk变量:

awk -v tempdir="$tempdir" ... '{... print > (tempdir"outputfile.txt"nfile)}' inputfile.txt

您之前已经创建了变量,但之后将其粘贴在字符串中,因此它不再是变量而是文字文本。

我在产生输出文件名的串联周围添加了parens,因为在输出重定向右侧的任何表达式都是括号,这是所有awk版本的可移植性所必需的。

答案 1 :(得分:1)

最好使用awk -v somevar="someval"'{....}',同时您可以访问ENVIRON,如下所示

$ tempdir="/tmp/somefolder" awk 'BEGIN{print ENVIRON["tempdir"]}'
/tmp/somefolder

ENVIRON是包含所有导出环境变量的关联数组,例如,如果要查看系统中导出的所有变量,可以使用下面的命令,但在当前上下文中-v tempdir="somedir/somepath"适合最好的。

$ awk 'BEGIN{for (i in ENVIRON)print i,ENVIRON[i]}'
IM_CONFIG_PHASE 1
DBUS_SESSION_BUS_ADDRESS unix:abstract=/tmp/dbus-5xGteFNyU3
SHLVL 1
XDG_SESSION_PATH /org/freedesktop/DisplayManager/Session0
GNOME_DESKTOP_SESSION_ID this-is-deprecated
PWD /home/akshay
...
...
...
CLUTTER_IM_MODULE = xim
XDG_SEAT = seat0
XMODIFIERS = @im=ibus
WINDOWID = 69206026

答案 2 :(得分:0)

最初的解决方案现在正在运行(引用的小错误)

print > "tempdir/outputfile.txt"nfile ####old
print > tempdir"/outputfile.txt"nfile ####new

   awk -v size=$(wc -l < inputfile.txt) -v perc=0.2 -v tempdir="/tmp" '{nfile = int(NR/(size*perc)); if(nfile >= 1/perc){nfile--;  } print > tempdir"/outputfile.txt"nfile}' inputfile.txt

从Akshay Hegde解决方案中获取想法后的另一种解决方案 -

awk -v size=$(wc -l < inputfile.txt) -v perc=0.2 -v tempdir="/tmp/" '{nfile = int(NR/(size*perc)); if(nfile >= 1/perc){nfile--;  } print > ENVIRON["tempdir"]"outputfile.txt"nfile}' inputfile.txt