GNU/Linux >> Linux の 問題 >  >> Ubuntu

ファイル名のForループ?

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に置き換えます 。


Ubuntu
  1. 初心者向けの例を含むShufコマンドチュートリアル

  2. ccryptを使用したファイルの暗号化と復号化

  3. スペースを含む AWK およびファイル名。

  1. Linux +スペースのあるファイルを無視(フィルター)する方法は?

  2. 男と.8ファイルを開く方法は?

  3. パターンの後にコンテンツをgrepする方法は?

  1. .txt ファイルに書き込みますか?

  2. ネストされた for ループ

  3. 長い名前の Linux mv ファイル