比較/比較のために、テキストファイルから特定の文字列を削除します。

比較/比較のために、テキストファイルから特定の文字列を削除します。

2つのテキストファイルを比較しようとしていますが、特定の文字列を無視する前に編集する必要があります。以下はテキストファイルの例です。

Processing Server ABC-123
oracle   10785     1  0 May17 ?        00:00:21 asm_smon_+ASM
oracle   11151     1  0 May17 ?        00:00:15 ora_smon_CSEREF
oracle   11656     1  0 May17 ?        00:00:16 ora_smon_prblogp
Processing Server ABC-456
Processing Server ABC-789
oracle      5514       1  0 May20 ?        00:00:13 asm_smon_+ASM
oracle      5777       1  0 May20 ?        00:00:11 ora_smon_COGCV05

目標は次のようにすることです。

Processing Server ABC-123
asm_smon_+ASM
ora_smon_CSEREF
ora_smon_prblogp
Processing Server ABC-456
Processing Server ABC-789
asm_smon_+ASM
ora_smon_COGCV05

私は2つを達成しようとしていると信じています。

  1. Processingで始まるすべての行を無視/維持
  2. oraまたはを含むすべての行を識別し、asmその前の文字列を削除します。

試してみましたが、awk私のsed特定のシナリオに適したコードの組み合わせが見つからないようです。

答え1

このような操作のために、私は通常、次のように入力を変換する関数を定義します。

transform() { awk '{print /^Processing/ ? $0 : $NF}' "$@"; }

または:

transform() {
  awk '/^Processing/ {print; next}
       $NF ~ /^(ora|asm)/ {print $NF; next}' "$@"
}

または:

transform() { grep -Po '^Processing.*|(?<!\S)(ora|asm)\S*$' "$@"; }

GNUgrepまたは互換ビルドがPerlと同様の正規表現をサポートしているとします。

次に、シェルにプロセス置換またはプロセスリダイレクトサポートがあるとします。

  • kshzsh//bash
    diff -u <(transform<file1) <(transform<file2)
    
  • yash
    diff -u /dev/fd/3 3<(transform<file1) /dev/fd/4 4<(transform<file2)
    
  • rcまたは派生(関数定義の構文も異なりますが)
    diff -u <{transform<file1} <{transform<file2}
    
  • fish(関数定義の構文も異なるが)
    diff -u (transform<file1|psub) (transform<file2|psub)
    

答え2

awkを使用してください。

$ awk '{print $(NF>3 ? NF : 0)}' file
Processing Server ABC-123
asm_smon_+ASM
ora_smon_CSEREF
ora_smon_prblogp
Processing Server ABC-456
Processing Server ABC-789
asm_smon_+ASM
ora_smon_COGCV05

興味のある部分だけを比較する場合は、比較する前にファイルを編集する必要はありません。たとえば、両方の入力ファイルは3行と5行のキー値が異なり、キー以外の値も異なります。ライン5、2、8の場合:

$ head file{1,2}
==> file1 <==
Processing Server ABC-123
oracle   10785     1  0 May17 ?        00:00:21 asm_smon_+ASM
oracle   11151     1  0 May17 ?        00:00:15 ora_smon_CSEREF
oracle   11656     1  0 May17 ?        00:00:16 ora_smon_prblogp
Processing Server ABC-456
Processing Server ABC-789
oracle      5514       1  0 May20 ?        00:00:13 asm_smon_+ASM
oracle      5777       1  0 May20 ?        00:00:11 ora_smon_COGCV05

==> file2 <==
Processing Server ABC-123
oracle   99999     1  0 May17 ?        00:00:21 asm_smon_+ASM
oracle   11151     1  0 May17 ?        00:00:15 here_we_go
oracle   11656     1  0 May17 ?        00:00:16 ora_smon_prblogp
Processing Server FOO-999
Processing Server ABC-789
oracle      5514       8  0 May20 ?        00:00:13 asm_smon_+ASM
oracle      5777       1  0 May20 ?        00:00:11 ora_smon_COGCV05

我々はすべての違いを見つけることができますdiff

$ diff file{1,2}
2,3c2,3
< oracle   10785     1  0 May17 ?        00:00:21 asm_smon_+ASM
< oracle   11151     1  0 May17 ?        00:00:15 ora_smon_CSEREF
---
> oracle   99999     1  0 May17 ?        00:00:21 asm_smon_+ASM
> oracle   11151     1  0 May17 ?        00:00:15 here_we_go
5c5
< Processing Server ABC-456
---
> Processing Server FOO-999
7c7
< oracle      5514       1  0 May20 ?        00:00:13 asm_smon_+ASM
---
> oracle      5514       8  0 May20 ?        00:00:13 asm_smon_+ASM

ただし、キー値のみが変更されたことがわかります。

$ awk '
    { key=$(NF>3 ? NF : 0) }
    NR==FNR { a[NR]=key} a[FNR] != key{print FNR , "<", a[FNR] ORS FNR, ">", key }
' file{1,2}
3 < ora_smon_CSEREF
3 > here_we_go
5 < Processing Server ABC-456
5 > Processing Server FOO-999

必要に応じて出力形式を調整します。

答え3

これはどうですか:

serverTracking.log(テスト目的のための偽のエントリを参照)

Processing Server ABC-123
oracle   10785     1  0 May17 ?        00:00:21 asm_smon_+ASM
oracle   11151     1  0 May17 ?        00:00:15 ora_smon_CSEREF
oracle   22231     2  0 May17 ?        00:00:16 som_other_TYPE
oracle   11656     1  0 May17 ?        00:00:16 ora_smon_prblogp
Processing Server ABC-456
Processing Server ABC-789
oracle      5514       1  0 May20 ?        00:00:13 asm_smon_+ASM
oracle      5777       1  0 May20 ?        00:00:11 ora_smon_COGCV05
oracle      5674       1  0 May20 ?        00:00:14 som_other_type

SEDスクリプト(Ubuntu bashを使用)

sed -E -n 's/(.* asm_.*)|(.* ora_.*)|(Processing Server.*)/\1\2\3/p' serverTracking.log | sed -E 's/(.*[0-9]*.:[0-9]*.:[0-9]*[[:blank:]]*)//' > serverTrackingFiltered.log

serverTrackingFiltered.log

Processing Server ABC-123
asm_smon_+ASM
ora_smon_CSEREF
ora_smon_prblogp
Processing Server ABC-456
Processing Server ABC-789
asm_smon_+ASM
ora_smon_COGCV05

答え4

助けてくれてありがとう!あなたのすべての提案はさまざまな方法で動作しますが、私に効果があったコマンドは次のとおりです。

sed -E -n 's/(.* asm_.*)|(.* ora_.*)|(Processing Server.*)/\1\2\3/p' BEFORE_FILE.txt | sed -E 's/(.*[0-9]*.:[0-9]*.:[0-9]*[[:blank:]]*)//' > /FOLDER/BEFORE_OUTPUT.log
sed -E -n 's/(.* asm_.*)|(.* ora_.*)|(Processing Server.*)/\1\2\3/p' AFTER_FILE.txt | sed -E 's/(.*[0-9]*.:[0-9]*.:[0-9]*[[:blank:]]*)//' > /xFOLDER/AFTER_OUTPUT.log

次に、MobaDiffを使用して2つのファイルを比較しました。効果はとても良いです!

関連情報