一个基本的Unix问题。
我有一个脚本来计算增量文件中的记录数。
awk '{
n++
} END {
if(n >= 1000) print "${completeFile}"; else print "${deltaFile}";
}' <${deltaFile} >${fileToUse}
然后,根据IF条件,我想处理相应的文件:
cut -c2-11 < ${fileToUse}
但是如何使用文件内容作为文件名本身?
如果有任何调整,请随意。
提前致谢
干杯
西蒙
答案 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"