institute という名前のファイル(テーブル)がいくつかあります。 _
モデル _
シナリオ _
川 .txt
(研究所 、モデル 、シナリオ 、および川 は変数です。)for
を作成したい 同じインスティテュートを持つ各ファイルを識別するループ 名前と同時に同じシナリオ それぞれの異なるモデルの結果を追加するための名前 同じ出力ファイルで、次のコマンドを使用します:
paste filename1.txt filename2.txt > output_file.txt
for
を作成する方法を知っています 別のフォルダをループしますが、ファイル名はループしません。誰かアイデアがありますか?
最小限の例として、ファイル名は次のようになります。
wbm_gfdl_rcp8p5_mississippi.txt
wbm_hadgem_rcp8p5_mississippi.txt
matsiro_gfdl_rcp8p5_mississippi.txt
matsiro_ipsl_rcp4p5_mississippi.txt
matsiro_hadgem_rcp4p5_mississippi.txt
matsiro_miroc_rcp8p5_mississippi.txt
次に、次のファイルを一緒に追加したいと思います。
wbm_gfdl_rcp8p5_mississippi.txt with
wbm_hadgem_rcp8p5_mississippi.txt
matsiro_ipsl_rcp4p5_mississippi.txt with
matsiro_hadgem_rcp4p5_mississippi.txt
matsiro_gfdl_rcp8p5_mississippi.txt with
matsiro_miroc_rcp8p5_mississippi.txt
承認された回答:
ファイルがすべて同じディレクトリにある場合は、次のことができます。
ls |
awk -F_ '{ i=$1; m=$2; s=$3; f[i"_"s] = f[i"_"s] " " $0 }
END{ for(insc in f)
printf "paste%s >out_%s.txt\n",f[insc],insc
}'
これはファイル名を「_」で分割します(-F_
)、変数i、m、s
をファイル名の最初の3つの部分(institute、model、scenario)に設定し、
ファイル名の配列に累積します。配列は、機関とシナリオによってのみ
インデックス付けされるため、すべてのモデルが連結されます
(mは使用されません)。最後のENDは、f配列を出力し、出力ファイルの
名としてインデックス(institute_scenario)を使用します。あなたの例では、これは
paste wbm_gfdl_rcp8p5_mississippi.txt wbm_hadgem_rcp8p5_mississippi.txt >out_wbm_rcp8p5.txt
paste matsiro_hadgem_rcp4p5_mississippi.txt matsiro_ipsl_rcp4p5_mississippi.txt >out_matsiro_rcp4p5.txt
paste matsiro_gfdl_rcp8p5_mississippi.txt matsiro_miroc_rcp8p5_mississippi.txt >out_matsiro_rcp8p5.txt
次に、これをシェルにパイプして実行する必要があります。 | sh
これを行うには、上の最後の行に移動します。
入力ファイルから一部の列を削除するには、すべての入力ファイル名を収集しているawk行
を変更する必要があります。最初のawk行:
{ i=$1; m=$2; s=$3; f[i"_"s] = f[i"_"s] " " $0 }
ファイル名は「$0」です。たとえば、この行を次のように変更した場合:
{ i=$1; m=$2; s=$3; f[i"_"s] = f[i"_"s] sprintf(" <(cut -f4 %s)",$0) }
次に、出力例が表示されます:
paste <(cut -f4 wbm_gfdl_rcp8p5_mississippi.txt) <(cut -f4 wbm_hadgem_rcp8p5_mississippi.txt) >out_wbm_rcp8p5.txt
ただし、2番目のファイル名のみを切り取りたい場合は、もう少し複雑であり、
代わりにこれが必要です:
{ i=$1; m=$2; s=$3;
if(f[i"_"s]=="")add = $0; else add = sprintf("<(cut -f4 %s)",$0);
f[i"_"s] = f[i"_"s] " " add }
だからあなたは得るでしょう
paste wbm_gfdl_rcp8p5_mississippi.txt <(cut -f4 wbm_hadgem_rcp8p5_mississippi.txt) >out_wbm_rcp8p5.txt
sh
の場合 構文を理解していません<(cut ...)
次に、それをbash
に置き換えます 。