行数が異なる2つのtxtファイルをインターリーブする方法

行数が異なる2つのtxtファイルをインターリーブする方法

ファイル1.txt:

1
2
3
4
5
6

ファイル2.txt:

A
B
C
D
E

希望の出力比は3:1(file3.txt)です。

1
2
3
A
4
5
6
B

私が試したコマンド:

  1. sed Rfile2.txt file1.txt >file3.txt
  2. paste -d '\n' file1.txt file2.txt >file3.txt

答え1

そしてpaste

paste -d '\n' <file1.txt - - - file2.txt

ファイルの 1 つが使い果たされた後でも、他のファイルにまだ行が残っている場合 (例に示すように) 行を出力し続けます。

そしてawk

awk '{print}; NR % 3 == 0 {getline < "file2.txt"; print}' file1.txt

またはGNUにsed対応するもの:

sed '3~3 R file2.txt' file1.txt

今回は使い果たされると停止しますが、使い果たされた場合はfile1.txt続きます(そして、バリアントでは空行を出力し、GNUバリアントでは何も出力しません)。file2.txtawksed

ファイルがすべて使い果たされたら停止します。

awk '{print}
     NR % 3 == 0 {
       if ((getline < "file2.txt") <= 0) exit
       print
     }' file1.txt

答え2

$ awk '{print} (FNR % 3)==0{getline<"file2.txt"; print}' file1.txt
1
2
3
A
4
5
6
B

どのように動作しますか?

  • print

    これにより、file1.txt のすべての行が印刷されます。

  • (FNR % 3)==0{ getline <"file2.txt"; print}

    3行目ごとにfile2.txtから1行を印刷します。

選ぶ

一部の人々はawkの使用に強く反対しますgetline。この場合:

$ awk 'FNR==NR{a[NR]=$0;next} {print} (FNR % 3)==0{print a[FNR/3]}' file2.txt file1.txt
1
2
3
A
4
5
6
B

どのように動作しますか?

  • FNR==NR{a[NR]=$0;next}

    最初のファイルを読み込んでいる間、file2.txtその行を配列に保存aし、残りのコマンドをスキップしてnext入力行にジャンプします。

  • print

    このポイントに達すると、2番目のファイルを読み取り、file1.txtその行を印刷します。

  • (FNR % 3)==0 {print a[FNR/3]}

    ファイルの行番号がfile1.txt3の偶数倍数の場合、file2.txt行番号が現在の行の1/3のファイルの行を印刷しますfile1.txt

答え3

Pythonを使う:

パスワード:

with open(sys.argv[1], 'rU') as f1, open(sys.argv[2], 'rU') as f2:
    while f1 or f2:
        for i, line in enumerate(f1):
            print line.strip()
            if i == 2:
                break
        if f2:
            try:
                print(next(f2).strip())
            except StopIteration:
                f2 = None

結果:

1
2
3
A
4
5
6
B

関連情報