14

次のことを行うbashスクリプトを作成しようとしています。

  1. 最初のファイルからコンテンツを読み取ります (最初の引数として)
  2. 2 番目のファイルから内容を読み取ります (2 番目の引数として)
  3. (3 番目の引数として) 指定されたパターンで 2 番目のファイルの行を検索します
  4. パターンの行の後に、最初のファイルから 2 番目のファイルにテキストを挿入します。
  5. 最終ファイルを画面に出力します。

例えば:

first_file.txt:

111111
1111
11
1

second_file.txt:

122221
2222
22
2

パターン:

2222

出力:

122221
111111
1111
11
1
2222
111111
1111
11
1
22
2

BASH でこの機能を実現するには、何を使用すればよいですか?

コードを書きましたが、正しく動作しません (なぜですか?):

    #!/bin/bash

    first_filename="$1"
    second_filename="$2"
    pattern="$3"

    while read -r line
    do
    if [[ $line=˜$pattern ]]; then
            while read -r line2
            do
                    echo $line2
            done < $second_filename
    fi
    echo $line
    done < $first_filename
4

5 に答える 5

37

sedループなしでそれを行うことができます。そのrコマンドを使用します:

sed -e '/pattern/rFILE1' FILE2

テスト セッション:

$ cd -- "$(mktemp -d)" 
$ printf '%s\n' 'nuts' 'bolts' > first_file.txt
$ printf '%s\n' 'foo' 'bar' 'baz' > second_file.txt
$ sed -e '/bar/r./first_file.txt' second_file.txt
foo
bar
nuts
bolts
baz
于 2013-05-29T10:23:57.723 に答える
2
于 2013-05-29T10:43:10.587 に答える
1

これはうまくいくはずです:

perl -lne 'BEGIN{open(A,"first_file.txt");@f=<A>;}print;if(/2222/){print @f}' second_file.txt

テスト済み:

> cat temp
111111
1111
11
1
> cat temp2
122221
2222
22
2
> perl -lne 'BEGIN{open(A,"temp");@f=<A>;}print;if(/2222/){print @f}' temp2
122221
111111
1111
11
1

2222
111111
1111
11
1

22
2
> 
于 2013-05-29T11:04:43.580 に答える