把awk代码放在bash中并对结果进行排序

时间:2012-10-22 16:55:50

标签: bash sorting awk

我有一个用于合并2个文件的awk代码,并使用“>>”将结果添加到file.txt的末尾

我的代码

NR==FNR && $2!=0 {two[$0]++;j=1; next }{for(i in two) {split(i,one,FS); if(one[3] == $NF){x=$4;sub( /[[:digit:]]/, "A", $4); print j++,$1,$2,$3,x,$4 | "column -t" ">>" "./Desktop/file.txt"}}}

我想把我的awk放到bash脚本中并最终排序我的file.txt并使用>再次将排序后的结果保存到file.txt

我试过这个

#!/bin/bash
command=$(awk '{NR==FNR && $2!=0 {two[$0]++;j=1; next }{for(i in two) {split(i,one,FS); if(one[3] == $NF){x=$4;sub( /[[:digit:]]/, "A", $4); print $1,$2,$3,$4 | "column -t" ">>" "./Desktop/file.txt"}}}}')
echo -e "$command" | column -t | sort -s -n -k4 > ./Desktop/file.txt 

但它给了我错误"for reading (no such a file or directory)"

我的错误在哪里?

提前致谢

1 个答案:

答案 0 :(得分:1)

1)您没有为awk脚本指定输入文件。这样:

command=$(awk '{...stuff...}')

需要:

command=$(awk '{...stuff...}' file1 file2)

2)你在行动部分内移动你的awk条件“NR == ...”,这样它就不再是一个条件了。

3)你的awk脚本输出进入“file.txt”,所以当你在后续行回显它时,“command”为空。

4)你有未使用的变量x和j

5)你不必要地将arg FS传递给split()。

等...

我认为你想要的是:

command=$( awk '
   NR==FNR && $2!=0 { two[$0]++; next }
   {
      for(i in two) {
          split(i,one)
          if(one[3] == $NF) {
             sub(/[[:digit:]]/, "A", $4)
             print $1,$2,$3,$4 
          }
      }
    }
' file1 file2 )
echo -e "$command" | column -t >> "./Desktop/file.txt"
echo -e "$command" | column -t | sort -s -n -k4 >> ./Desktop/file.txt

但很难说。