2014-11-22 99 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 
% 

你還需要什麼來進行?