Bashを使用して、複数のテキストファイルの特定の行から特定の文字列を単一のファイルにリンクします。

Bashを使用して、複数のテキストファイルの特定の行から特定の文字列を単一のファイルにリンクします。

次の形式の *.txt という名前のテキストファイルが約 100 個あります。

=========================================================
 rho_center   e_center    Mass      Mass_0      R_e
 1.0000e-03 1.1236e-03 1.5379e+00 1.6522e+00 1.0734e+01
     J         T/W       Omega   Omega_Kepler axes_ratio
 0.0000e+00 0.0000e+00 0.0000e+00 3.5265e-02 1.0000e+00
    J/M^2
 0.0000e+00
=========================================================
yy| rhoc  =   1.00000000e-03 ;
yy| rp_re =   1.00000000e+00 ;
yy| A_diff=   1.00000000e+00 ;
yy| Re    =   1.07336268e+01 ;
yy| M0    =   1.65219709e+00 ;
yy| M     =   1.53786062e+00 ;
yy| W     =   2.10814073e-01 ;
yy| T     =   0.00000000e+00 ;
yy| J     =   0.00000000e+00 ;
yy| beta  =   0.00000000e+00 ;
yy| M_R   =   1.43275023e-01 ;
  | === periods in msecs ==========
yy| Pa    =              inf ;
yy| Pe    =              inf ;
yy| td    =   8.46677695e-01 ;
yy| PK    =   8.77582921e-01 ;
yy| MDIV = 301 ; SDIV = 601;

次のようにテキストファイルでrhocとMの値を連結したいと思います。

rhoc M
0.001 1.537
...    ...
0.004 2.328

私は初めてbashに触れ、awkを使ってこれを試しましたが失敗しました。このためにbashスクリプトをどのように書くことができますか?

ベストアンサー1

たとえば、ファイルごとに/ gawk1つしかないとします。rhocM

gawk '
  BEGIN {print "rhoc M"}
  BEGINFILE {delete field}
  $3 == "=" {field[$2] = $4}
  ENDFILE {
    if (("rhoc" in field) && ("M" in field))
      print field["rhoc"], field["M"]
  }' ./*.txt

ファイル名に基づいてアルファベット順にファイルを処理します。使用する場合は、順序が数字になるように置き換えてzshください(だから./*.txt./*.txt(n)file2.txt今後 file10.txt例えば)。

おすすめ記事