0

そのため、8 番目の列に基づいて、かなり大きなファイルをいくつかの小さなファイルに分割したいと考えています。だから私はこのスクリプトを書いた:

#!/bin/bash
run_command(){
eval ${1}
wait
}
chInput=("1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" "13" "14" "15" "16" "17" "18" "19" "Z" "T" "G" "F" "A" "D" "P")
sampInput=("heyA")

for ((x=0;x<${#chInput[@]};x++));do
com="awk -F'\t' '$8=="${chInput[x]}"' /home/location/"$sampInput"_This_P.txt > "$sampInput"Ch"${chInput[x]}".txt"
run_command "${com}"
done

しかし、それは機能していません

'$8==

awk: ==1
awk: ^ syntax error
awk: ==2
awk: ^ syntax error
awk: ==3
awk: ^ syntax error
awk: ==4
awk: ^ syntax error

でもやってるだけ

awk -F'\t' '$8==1' /home/location/heyA_This_P.txt > Ch1.txt

コマンドラインからはうまくいきました

この問題を解決するにはどうすればよいですか?

4

1 に答える 1

2

深刻な問題は二重引用符です。$8変数を割り当てた時点で、何か (おそらく何もない) に置き換えられます。適切なエスケープを使用して一重引用符を使用することもできますが、実際の解決策はおそらく、深呼吸evalして、変数に Awk スクリプトを含めずに最初からやり直すことです。

とにかく、このプレッツェル ロジックの目的は何ですか? http://mywiki.wooledge.org/BashFAQ/050のアドバイスを読んで、心に留めておくべきでしょう。

問題を解決するための簡単な試みを次に示します。

#!/bin/bash

chInput=("1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" "13" "14" "15" "16" "17" "18" "19" "Z" "T" "G" "F" "A" "D" "P")
sampInput=("heyA")

for ((x=0;x<${#chInput[@]};x++));do
    awk -F'\t' '$8=="'"${chInput[x]}"'"' /home/location/"$sampInput"_This_P.txt > "$sampInput"Ch"${chInput[x]}".txt
done

特に、スクリプトに補間"${chInput[X]}"するための構造に注意してください (変数とその他のものを削除することを除けば、実際に変更したのはこれだけですeval)。これは、単一引用符で囲まれた文字列で、二重引用符で囲まれた文字列に隣接し、単一引用符で囲まれた文字列に隣接し、Bash では単一の文字列に評価されます。So'foo'"bar"'baz'は に評価されfoobarbaz、同様に'"foo"'隣接する は に"'bar'"評価され"foo"'bar'ます。ここで、'$8=="'隣接する"${chInput[x]}"隣接する隣接するは、割り当て時に二重引用符内のものが置換される場所に'"'評価されます。$8=="..."

(配列も実際には必要ありません。単に行うことができます

for c in "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" \
         "13" "14" "15" "16" "17" "18" "19" "Z" "T" "G" "F" \
         "A" "D" "P"
do
    awk -F'\t' '$8=="'"$c"'"' /home/location/"$sampInput"_This_P.txt > "${sampInput}Ch$c.txt"
done

Classic Bourne シェルと互換性があります。)

于 2013-04-12T20:19:08.383 に答える