2014-11-22 102 views
1

我打开一个文件并检查列1 & 8中的项目是否与特定规格匹配。如果是,则将输出写入文件x。如果列1中的项目与规格匹配,但列8与规格不匹配,请将输出写入文件y。我定义了多个变量(awk -v v = $ var,f1 = $ file,f2 = $ output),我相信我如何引用f1 & f2是问题所在。如果我删除引号:Awk:使用多个定义的变量打印到不同的文件

print $0 >> f2 
awk: cmd. line:5: (FILENAME=- FNR=2) fatal: expression for `>>' redirection has null string value 

如果我把在$:

print $0 >> $f2 

我结束了一群与我不想怪名字的文件,并将这些文件怎么办想要是空的(除了回显线)。

如果我把“”:

print $0 >> "f2" 

我想几乎是空的文件,并创建一个名为F2的文件。

#!/bin/bash 

output="output.txt" 
echo -e "C1\tSeqID\tAminoAcid\tCD1\tCD2\tCD3\tGene\tEnvironment\tFilename" > $output 
inputFile="input.txt.gz" 

for var in A B C D E F G H I J K L 
do 
    file=$var".txt" 
    echo -e "C1\tSeqID\tAA\tCD1\tCD2\tCD3\tGene\tEnvironment\tFilename" > $file 

    #---Wrong, forgot to catch $8 != v 
    #zcat $inputFile | awk -v v=$var '{ 
# if ($8 == v && ($1 == "V1" || $1 == "V2" || $1 == "V3" || $1 == "V4" || $1 == "V5" || $1 == "V6" || $1 == "V7" || $1 == "V8" || $1 == "V9" || $1 == "V10")) 
# print $0 
# }' | tee -a $file $output 

    zcat $inputFile | awk -v v=$var,f1=$file,f2=$output '{ 
    if ($8 == v && ($1 == "V1" || $1 == "V2" || $1 == "V3" || $1 == "V4" || $1 == "V5" || $1 == "V6" || $1 == "V7" || $1 == "V8" || $1 == "V9" || $1 == "V10")) 
    print $0 >> "file" 
    else if ($8 != v && ($1 == "V1" || $1 == "V2" || $1 == "V3" || $1 == "V4" || $1 == "V5" || $1 == "V6" || $1 == "V7" || $1 == "V8" || $1 == "V9" || $1 == "V10")) 
    print $0 >> "f2" 
    }' 

    gzip $file 
done 

gzip $output 

我可以运行循环,并有两个单独的awk命令写入不同的文件。但是,它是一个非常大的文件(4G压缩),使用我目前的方法(或类似的方法)效率更高。任何指导如何引用第二个变量的第二个&非常感谢。

回答

2

使用单独-v S:

awk -v v="$var" -v f1="$file" -v f2="$output" '...' 
+0

啊。谢谢@Ed Morton。这似乎是工作无错误和写入f1,但是,F2仍然是空的(除了回声线)。我会看到它是如何完成的,如果仍有问题,我会提出一个新问题。再次感谢你。 – cer 2014-11-22 22:09:42

+1

它工作完美。谢谢埃德。 – cer 2014-11-22 22:13:33

0
% awk -v v=qw,f1=we,f2=as 'BEGIN{print v, "*", f1, "*", f2}' 
qw,f1=we,f2=as * * 
% awk -v v=qw -v f1=we -v f2=as 'BEGIN{print v, "*", f1, "*", f2}' 
qw * we * as 
% 

你还需要什么来进行?