2016-08-04 17 views
-1

以下に示すように、私は、各行の列の等しくない数のタブDELIMファイルを持っている:各列についてawk/unixコマンドを使用して各列をすべて分割して各行に抽出する方法は?

1_20_50_x_y_d 1_39_60_x_y_z 1_25_50_d_f_g 1_30_55_e_f_g 
1_10_50_x_y_d 1_29_60_x_y_z 1_30_70_d_f_g 
1_20_50_x_y_d 1_39_80_x_y_z 

を、私は「_」で区切られた最初の3つの要素を抽出して記述する必要がありする必要がありますすべての列のうち2番目と3番目の要素からの最小値と最大値です。最初の列は最初の要素と同じままです。以下のように出力が見えます:私はあなた(と誰もがテキストを操作する)をお勧めします

1 20 60 
1 10 70 
1 20 80 
+0

タブで区切られた要素は、常に6個の要素がアンダースコアで区切られていますか? – JNevill

答えて

2
$ cat tst.awk 
BEGIN { FS=OFS="\t" } 
{ 
    for (i=1; i<=NF; i++) { 
     split($i,f,/_/) 
     if (i == 1) { 
      key = f[1] 
      min = max = f[2] 
     } 
     min = (f[2] < min ? f[2] : min) 
     min = (f[3] < min ? f[3] : min) 
     max = (f[2] > max ? f[2] : max) 
     max = (f[3] > max ? f[3] : max) 
    } 
    print key, min, max 
} 

$ awk -f tst.awk file 
1  20  60 
1  10  70 
1  20  80 

アーノルド・ロビンス著有効なawkプログラミング、第4版を、読んで。

関連する問題