
ファイル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
私が試したコマンド:
sed Rfile2.txt file1.txt >file3.txt
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.txt
awk
sed
ファイルがすべて使い果たされたら停止します。
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.txt
3の偶数倍数の場合、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