2017-02-23 36 views
1

以下命令分割文件工作正常,当我为输出文件“打印>“/tmp/outputfile.txt"nfile}'”提供的绝对路径:如何在awk中使用路径变量?

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 

回答

1

ENVIRON ONL y适用于在命令行上导出或设置的变量。在任何情况下,只需使用-v给init具有相同名称的shell变量的值命名tempdir一个awk变量:

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

您已经创建的变量之前,但随后陷入它里面的字符串,因此它是不再是一个变量,而是文字文本。

我添加了parens来产生你的输出文件名,因为在所有awk版本中,输出重定向右边的任何表达式都是可移植的。

+0

工作正常,但当我用下面的命令,它工作正常 - awk -v size = $(wc -l <​​inputfile.txt)-v perc = 0.2 -v tempdir =“/ tmp/output.txt”'{nfile = int(NR /(size * perc) ); if(nfile> = 1/perc){nfile--; }打印> tempdir}'inputfile.txt 内部打印tempdir变量工作正常没有括号,意味着每当我们需要使用连接字符串与打印我们必须使用括号。 –

+0

再次强调,在所有awk版本中,输出重定向右侧的任何表达式都是必需的,以便可移植。换句话说,它在没有它们的情况下可以在一些awk中工作,但不是全部。 –

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 
+0

我在我的解决方案中也尝试了ENVIRON [“tempdir”],但它在我的情况下并不奏效,从Ed Morton的解决方案中学习 - 如果我们使用连接与路径变量连接,我需要使用括号。 –

+0

@VIPINKUMAR:'这个'tempdir ='/ tmp/somefolder“awk'BEGIN {print ENVIRON [”tempdir“]}''是否适合你? –

+1

是的 - 它是为我工作,看起来像我们需要声明变量,然后使用ENVIRON也从awk手册页 - ENVIRON使用环境变量,这就是为什么我没有声明变量,但试图在打印stmt使用ENVIRON。 –

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 

采取从阿克沙伊赫格德解决方案的想法后,另一个解决方案 -

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