3

fileAとfileBの2つのファイルがあります。

fileAに含まれるもの:

71
32
23
10
...

fileBには次のものが含まれます。

ok
no
no
ok
...

fileBの同じ行が「no」に一致する場合、fileAの行を削除します。したがって、結果のfileAは次のようになります。

71
10
...

任意のコマンドまたはbashスクリプトまたはvimがこれを行うことができますか?

4

2 に答える 2

2

貼り付けを使用して行を結合し、whileループを使用して行を反復処理できます。

while read -r a_input b_input; do
   [[ $b_input == "ok" ]] && echo "$a_input"
done < <(paste -d' ' fileA fileB)

完全を期すためにawkを使用する:

awk '$2 == "ok" { print $1 }' < <(paste -d' ' fileA fileB)
于 2012-09-25T03:46:16.253 に答える
2

これがトリックを行うべき簡単なワンライナーです:

sed "$(awk '/no/{print NR"d"}' fileB)" fileA

上記の「no」という単語が表示されている場所と一致するように正規表現を配置する場所。

これは、最初の文字をawkでスキャンし、行番号の後に一致する場所の文字「d」を出力することで機能します。このパターンはnd、入力ストリームのn行目を削除するsedコマンドです。

このバージョンでは、fileAの内容は変更されませんが、行を削除した結果がstdoutに出力されます。sedの-iフラグを使用して、ファイルを変更します。

sed -i "$(awk '/no/{print NR"d"}' fileB)" fileA
于 2012-09-25T03:53:38.793 に答える