1

多数のテキストファイル(通常はrt ??????。MONという名前)を含むディレクトリがあります。各ファイルには、次の形式の結果が含まれています

#        HEADER INFO
#        ...
#
# --- TIME SERIES ---
#       TIME     Var1     Var 2     ...
#        [s]     [kg]     [kg]      ...
#          1       2        3       ...  
  0.0000E+00  1.0000E+00  1.0000E+00  ...
  6.4619E+00  2.0000E+00  2.0000E+00  ...
  6.4619E+00  2.5000E+00  2.5000E+00  ...
  8.9690E+00  3.0000E+00  3.0000E+00 ...
  ...

各ファイルを読み取り、重複した時間の行を削除するBASHスクリプトを作成しようとしています(これは丸めが原因です)。したがって、上記の例の場合、出力は次のようになります。

#        HEADER INFO
#        ...
#
# --- TIME SERIES ---
#       TIME     Var1     Var 2     ...
#        [s]     [kg]     [kg]      ...
#          1       2        3       ...  
  0.0000E+00  1.0000E+00  1.0000E+00  ...
  6.4619E+00  2.0000E+00  2.0000E+00  ...
  8.9690E+00  3.0000E+00  3.0000E+00 ...

BASHの初心者なので、ポインタはありがたいことに受け取られます。

4

4 に答える 4

1

同じ時間が隣接している場合(つまり、次の行で)、。だけを使用できますuniquniq前の行との比較を開始する場所、およびチェックする必要のある文字数(少なくともGNUのもの)を指定するパラメーターがあります。この場合、数字は固定文字で始まり、固定文字で終わるように見えますが、次のように書くことができます。

uniq --skip-chars=2 --check-chars=10 infile > outfile

outfileこの文字セットの時点で異なる行を保持します。

sudo_Oがコメントしているように、このソリューションはファイルのヘッダー部分に干渉する可能性があります。grep私は通常、データだけでファイルを作成し、後でヘッダーを追加するか、または他のツールを使用してデータの行だけを取得する前にファイルをフィルタリングしてから、ヘッダー部分を追加することを好みます。

于 2013-03-05T17:42:33.293 に答える
1

このワンライナーを試してみてください:

awk '$1!~/^#/&&$1 in a{next;}{a[$1]}1' file 
于 2013-03-05T17:53:56.400 に答える
0

Awkはこれに最適です:

$ awk '$1~/^[0-9].[0-9]{4}E[+-][0-9]{2}$/{if(!a[$1]++)print;next}1' file
#        HEADER INFO
#        ...
#
# --- TIME SERIES ---
#       TIME     Var1     Var 2     ...
#        [s]     [kg]     [kg]      ...
#          1       2        3       ...
  0.0000E+00  1.0000E+00  1.0000E+00  ...
  6.4619E+00  2.0000E+00  2.0000E+00  ...
  8.9690E+00  3.0000E+00  3.0000E+00 ...
  ...

このように厳密な正規表現の比較を使用すると、必要な重複のみが削除され、のようawkに重複時間が隣接している必要がないという利点がありuniqます。

于 2013-03-05T17:43:39.113 に答える
0

あなたが試すことができるもう一つ:

awk '/^#/ || !A[$1]++' file
于 2013-03-05T19:52:05.717 に答える