1

没有 tmp1 和 tmp2 怎么办?(资料文件好)

      cat information_file1 | sed -e 's/\,/\ /g' >> tmp1
      echo Messi >> tmp2
      cat tmp1 | grep Ronaldo  | cut -d"=" -f2- >> tmp2
      rm tmp1
      cat information_file2 | fin_func tmp2
      rm tmp2

fin_func 供您参考。(它不是真正的 func,我不想更改它只是因为您会看到我如何使用 tmp2 和 info_file2)

while read -a line; do

if [[ "`grep $line $1`" != "" ]]; then
echo 1
fi

done
4

2 回答 2

1

这应该可行,尽管它非常不全面:

cat information_file2 | fin_func <(cat <(echo Messi) <(cat information_file1 | \
  sed -e 's/\,/\ /g' | grep Ronaldo | cut -d"=" -f2-))

<( … )语法是Bash 的进程替换,它返回一个文件/dev/fd文件描述符的名称以及它写入的输出。

于 2013-08-04T08:22:01.670 回答
0

该示例fin_func多次读取作为命令参数给出的文件,因此除非我们被允许修改该函数,否则至少需要一个临时文件。可以轻松修改问题中给出的示例fin_func,使其不会多次读取文件,但由于您指出这不是真正的脚本,我将假设它无法修改并且必须将文件作为参数。也就是说,我会将您的脚本编写为:

trap 'rm -f $TMPFILE' 0  # in bash, just trapping on 0 will work for SIGINT, etc 
TMPFILE=$( mktemp ) 

{ echo Messi
tr , ' '  < information_file1 | 
awk -F= '/Ronaldo/{print $2}' ; } > $TMPFILE
< information_file2 fin_func $TMPFILE

我强烈怀疑它fin_func可以被重写,以便它不需要常规文件作为输入。此外,不需要 , tr,因为您只能gsubawk匹配行上并节省一些处理,但这可能是一个微不足道的优化。但是,使用tr而不是在sed美学上是必要的。

于 2013-08-04T14:20:59.967 回答