我正在打开一个文件并检查第1列和第1列中的项目8符合某些规格。如果是,则将输出写入文件x。如果第1列中的项目与规范匹配,但第8列与规范不匹配,请将输出写入文件y。
我正在定义多个变量(awk -v v = $ var,f1 = $ file,f2 = $ output),我相信我如何引用f1& f2是问题所在。如果我删除引号:
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压缩),使用我当前的方法(或类似的东西)更有效。有关如何参考第二个和第二个的任何指导第三个变量非常感谢。
答案 0 :(得分:2)
使用单独的-v
s:
awk -v v="$var" -v f1="$file" -v f2="$output" '...'
答案 1 :(得分: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
%
你还需要其他什么吗?