2013-02-07 71 views
0

這裏有一個新人,希望問題有一個簡單的解決方案,但我似乎無法管理。將awk輸出指向變量

所以,我有一大堆我需要使用相同的命令行程序進行處理的文件,並且我正在嘗試編寫一個小的shell腳本來自動執行此操作。我寫了一些將從文本文件中讀取輸入文件名的內容,然後爲每個文件重複該命令。到現在爲止還挺好。我的問題是命名輸出。每個文件都以通用格式「lane_number_bla_bla_bla」命名,並且它們是成對處理的。因此,需要將「lane_1_bla_bla_bla_001」和「lane_1_bla_bla_bla_002」組合成單個輸出文件。爲此,我試圖使用awk從輸入文件的.txt列表中讀取樣本編號,並將其解析爲輸出文件編號。下面是我提出的代碼(注意命令前面的echo語句僅用於測試;它在運行實際程序時被刪除;這不是實際的命令,而是更復雜的,但原則仍然適用):

echo "Which input1 should I use?" 
read text 
input1=$text 
echo "Which input2 should I use?" 
read text 
input2=$text 
echo "How many lines?" 
read text 
n=$text 
for i in $(seq 1 $n) 
do 
    awkinput1=$(awk NR==$i $input1) 
    awkinput2=$(awk NR==$i $input2) 
    num=$(awk 'NR==$i{print $2 }' FS="_" $input1) 
    lane=$(awk 'NR==$i{print $1 }' FS="_" $input1) 
    echo "command $awkinput1.in > $awkinput1.out && command $awkinput2.in > $awkinput2.out && command cat $awkinput1.out $awkinput2.in > $num-$lane-CAT.out &" 
    if (($i % 10 == 0)); then wait; fi # Limit to 10 concurrent subshells. 
done 

當我運行此,無論是$ awkinput領域獲得由適當的文件名的COMAND行更換,但不是$ NUM和$車道領域,其打印什麼。

那麼,我做錯了什麼?我相信這很簡單,但我嘗試了很多不同的方法來格式化相關的awk命令,而且似乎沒有任何工作。我在使用SSH協議的遠程Linux服務器上執行此操作,如果它有所作爲。

非常感謝!

+0

'FS = _'可能需要腳本之前去 – Kevin

回答

1
  1. Shell不解析$i單引號引用(')。所以引用的字符串應在$i之前終止。
  2. FS應該在解析行之前設置。

以下代碼將起作用。下面

num=$(awk 'BEGIN{FS="_"} NR=='$i'{print $2 }' $input1) 
lane=$(awk 'BEGIN{FS="_"} NR=='$i'{print $1 }' $input1) 

代碼的效率會更高:

while read in1 ; do 
    read in2 <&3 
    num=$(awk 'BEGIN{FS="_"} {print $2 }' <<<"$in1") 
    lane=$(awk 'BEGIN{FS="_"} {print $1 }' <<<"$in1") 
    ... 
done <$input1 3<$input2