2

1 行に 1 つの文を含む 2 つのファイルを織り交ぜようとしています。最初のファイルをダブル スペース ( sed G) にして、2 番目のファイルの内容をそれらの空行に組み込みたいと思います。

ファイル B の 1 行目がファイル A の 1 行目より下に、ファイル B の 2 行目がファイル A の 2 行目より下になるように、両方のファイルを織り交ぜるにはどうすればよいですか?

例: [行番号|文番号|文]

1  1 fileA
2   
3  2 fileA
4  
5  3 fileA
6  
7  4 fileA

期待される結果:

1  1 fileA
2  1 FILEB
3  2 fileA
4  2 FILEB
5  3 fileA
6  3 FILEB
7  4 fileA

これは bash スクリプト用です: または で実行できますsedawk?

4

5 に答える 5

7

これはうまくいくかもしれません(GNU sed):

sed 'R fileB' fileA

最初にファイルのスペースを 2 倍にする必要はありません。

ただし、空の行を置き換えたい場合:

sed -e '/./!{R fileB' -e ';d}' fileA
于 2012-10-11T20:08:59.783 に答える
2

元のスペースのないファイルがある場合は、pasteplus (GNU)を使用できますsed。私はControl-Aあなたの文に ^A ( ) 文字がないと仮定しています:

paste -d'^A' fileA fileB | sed 's/^A/\n/'

このpasteコマンドは、2 つのファイルの行を連結しsed、マーカー ^A を改行に置き換えます。これは GNU でうまく機能しますsed。BSD ではあまりうまくいきませんsed。次のものも使用できますawk

paste -d'^A' fileA fileB | awk '{sub(/^A/, "\n"); print}'

スクリプト内の が表示されるControl-A場所を忘れずに入力してください。^A

また、Perl を使用して簡単に行うこともできます。この場合、必要なプロセスは 2 つではなく 1 つだけです。


また、制御文字を で変換できることも思い浮かびますtr。これは間違いなく簡単です。

paste -d'^A' fileA fileB | tr '\001' '\012'  # octal escapes for ^A and NL
于 2012-10-11T20:40:32.640 に答える
2

最初のファイルのダブル スペースを解除する場合 (例: をsed -n 1~2p使用)、改行区切り文字を使用できpasteます (GNU ペーストでテスト済み):

paste -d'\n' file1 file2

Birei の回答のファイルを使用したテスト:

fileA 1
fileB 1
fileA 2
fileB 2
fileA 3
fileB 3
于 2012-10-15T14:32:50.703 に答える
1

もう一つの例:

file1

fileA 1
fileA 2
fileA 3

file2

fileB 1
fileB 2
fileB 3

指示:

awk '{getline a < "file2" split(a, b, FS); print NR, $2, $1 "\n" NR+++1, b[2], b[1] }' file1

結果:

$ awk '{getline a < "file2" split(a, b, FS); print NR, $2, $1 "\n" NR+++1, b[2], b[1] }' file1
1 1 fileA
2 1 fileB
3 2 fileA
4 2 fileB
5 3 fileA
6 3 fileB
于 2012-10-11T21:04:40.953 に答える
1

使用awk:

fileAにデータがあると仮定します。

fileA 1
fileA 2
fileA 3

そしてfileBと:

fileB 1
fileB 2
fileB 3

次のスクリプトを実行します。

awk 'FNR < NR { exit; } { getline lineB <ARGV[ARGC-1]; printf "%s\n%s\n", $0, lineB; }' fileA fileB

これにより、次の結果が得られます。

fileA 1
fileB 1
fileA 2
fileB 2
fileA 3
fileB 3
于 2012-10-11T20:23:49.087 に答える