2

txtファイルのデータ操作に問題があります。私のファイルは現在次のようになっています:

    HG02239 -23.42333333
    NA06985NA06985  -20.125
    NA06991NA06991  -20.92

これは、タブ区切りのデータの一部を示しています。エントリの半分は正しい7文字(letterletternumbernumbernumbernumbernumbernumber)形式ですが、一部は2倍になっています。2番目の列(最初の列は理由で空です!)に移動し、文字列の繰り返しを削除して、次のようにします

    HG02239 -23.42333333
    NA06985  -20.125
    NA06991  -20.92

列ごとにsed/awkでこれを行う方法を理解できません。正規表現を記述できるはずですが、データが繰り返しであるため、文字列の前半を失いたくありません。特定の列を切り取る方法がわからないか、7番目の文字を削除するだけです。どんな助けでも大歓迎です!

4

3 に答える 3

2

解決

これは、後方参照を使用して解決できます。たとえば、GNUsedを使用すると次のようになります。

$ cat << EOF | sed --regexp-extended 's/(.{7})\1/\1/'
HG02239 -23.42333333
NA06985NA06985  -20.125
NA06991NA06991  -20.92
EOF

HG02239 -23.42333333
NA06985 -20.125
NA06991 -20.92

GNU sedを使用していない場合は、キャプチャグループをエスケープする必要があります。さらに、より正確な文字の一致が必要な場合は、正規表現を調整できます。

説明

catパイプラインは、コードの表示とテストを簡単にするためのヒアドキュメントです。ファイルに対してsedを直接呼び出すか、結果に問題がなければ-iフラグを使用してインプレース編集を実行できます。

sedスクリプトは次のことを行います。

  1. 「間隔式」(中括弧内の数字)を使用して、7つの連続する文字の任意のグループをキャプチャグループに格納します。
  2. \1、最初のキャプチャグループに一致する後方参照です。
  3. 一致は「キャプチャグループとそれに続くキャプチャグループのコピー」を探します。
  4. 置換により、一致がキャプチャグループの単一のコピーに置き換えられます。
于 2012-07-11T11:38:59.173 に答える
0

次のようなものを使用できます。

sed -i 's|\([A-Z]\{2\}[0-9]\{5\}\)[A-Z0-9]*\s*\(.*\)|\1 \2|g' <your-file>
于 2012-07-11T11:56:41.173 に答える
0

一方向、使用awk

awk '{ print substr($1, 1, 7), $2 }' file.txt

出力:

HG02239 -23.42333333
NA06985 -20.125
NA06991 -20.92
于 2012-07-11T12:15:43.207 に答える