0

いくつかの大きなテキスト ファイルで条件付き置換を実行したいと考えています。構造は

1 ad sd bg we we A.2 890 3434 DATA
2 gf nh ok wa we A.1 890 3434 DATA
3 gf nh ok wa we A.1 890 3434 
...
...

10列目に「DATA」という値が存在する場合(必ずあるとは限りません)、7列目の要素がA.1かどうかをチェックしたいと思います。その場合はB.2に代用

Seeとawkのアプローチを混在させてみましたが、うまくいきませんでした.bashでこれを行うためのヒントはありますか?

4

2 に答える 2

1
awk '$10=="DATA"&&$7=="A.1"{$7="B.1"}1'
于 2012-04-18T23:38:22.073 に答える
0

以下は、「DATA」と「A.1」の両方を含む行を見つけ、「A.1」を「B.2」に置き換えて、新しい出力を提供します。

注: 次のコマンドは、特定のフィールドを区別しません。「DATA」と「A.1」が同じ行にある限り、「A.1」は「B.2」に変更されます。

sed -e '/A\.1.*DATA/!d;s/A\.1/B\.2/' /yourfile

ファイルを編集して他の行をそのままにしておくには、次の bash スクリプトを試してください。以下はインライン編集を含みます。何かをテストする前に、ファイルをバックアップしてください。

#!/bin/bash

ORIG=$(sed -e '/A\.1.*DATA/!d' /yourfile)
NEW=$(sed -e '/A\.1.*DATA/!d;s/A\.1/B\.2/' /yourfile)

sed -i "s/${ORIG}/${NEW}/g" /yourfile

注: OS X ユーザーの場合は、次のことを試してください。-i スイッチは、OS X では少し異なります (スクリプトにはインライン編集が含まれているため、テストする前にファイルをバックアップしてください)。

#!/bin/bash

ORIG=$(sed -e '/A\.1.*DATA/!d' /yourfile)
NEW=$(sed -e '/A\.1.*DATA/!d;s/A\.1/B\.2/' /yourfile)

sed -i '' "s/${ORIG}/${NEW}/g" /yourfile
于 2012-04-19T02:41:33.953 に答える