Unix:使用其他文件中的文件名

时间:2017-06-27 20:25:50

标签: unix awk

一个基本的Unix问题。

我有一个脚本来计算增量文件中的记录数。

awk '{ 
    n++ 
  } END {
    if(n >= 1000) print "${completeFile}"; else print "${deltaFile}";
  }' <${deltaFile} >${fileToUse}

然后,根据IF条件,我想处理相应的文件:

cut -c2-11 < ${fileToUse}

但是如何使用文件内容作为文件名本身?
如果有任何调整,请随意。

提前致谢
干杯
西蒙

1 个答案:

答案 0 :(得分:1)

使用文件的内容作为文件名,该文件本身由变量(按要求)

标识
 cut -c2-11 <"$( cat $filetouse )"
 // or in zsh just
 cut -c2-11 <"$( < $filetouse )"

除非文件中的文件名以一个或多个换行符结尾,人们很少这样做,因为它很尴尬和不方便,所以:

read -rdX var <$filetouse; cut -c2-11 < "${var%?}"
// where X is a character that doesn't occur in the filename
// maybe something like $'\x1f' 

调整:您的awk打印变量引用 ${completeFile}${deltaFile}(因为它们位于单引号awk脚本中)不是任何变量的值。如果您真的想要这个值,正如我对您的描述所期望的那样,您应该将shell变量传递给像这样的awk vars

 awk -vf="$completeFile" -vd="$deltaFile" '{n++} END{if(n>=1000)print f; else print d}' <"$deltaFile"`
 # the " around $var can be omitted if the value contains no whitespace and no glob chars
 # people _often_ but not always choose filenames that satisfy this
 # and they must not contain backslash in any case

或将shell变量导出为env变量(如果它们尚未存在)并像

一样访问它们
 awk '{n++} END{if(n>=1000) print ENVIRON["completeFile"]; else print ENVIRON["deltaFile"]}' <"$deltaFile"

此外,您不需要自己的计数器,awk已经计入输入记录

 awk -vf=... -vd=... 'END{if(NR>=1000)print f;else print d}' <...

或更简单

 awk -vf=... -vd=... 'END{print (NR>=1000?f:d)}' <...

或使用文件参数而不是重定向,以便脚本可以使用该名称

awk -vf="$completeFile" 'END{print (NR>=1000?f:FILENAME)}' "$deltaFile" # no < 

并且如上所述禁止尾随换行符,根本不需要中间文件,只需

 cut -c2-11 <"$( awk -vf="$completeFile" -'END{print (NR>=1000?f:FILENAME)}' "$deltaFile")"

或者你真的不需要awk,wc可以进行计数,任何POSIX或经典shell都可以进行比较

 if [ $(wc -l <"$deltaFile") -ge 1000 ]; then c="$completeFile"; else c="$deltaFile"; fi
 cut -c2-11 <"$c"