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つを達成しようとしていると信じています。
Processing
で始まるすべての行を無視/維持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と同様の正規表現をサポートしているとします。
次に、シェルにプロセス置換またはプロセスリダイレクトサポートがあるとします。
ksh
zsh
//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)