私はawkを使ってやや具体的な方法で2つのテキストファイルをマージしようとしています。 file1 から 2 行を取り、file2 から単語セット (ただし別の行にある) を無限に交互に使用します。 file2 の単語グループはコンマで区切られます。たとえば、
ファイル1
A Partridge in a Pear Tree
Two Turtle Doves
Three French Hens
Four Calling Birds
Five Gold Rings
Six Geese a-Laying
Seven Swans a-Swimming
Eight Maids a-Milking
Nine Ladies Dancing
Ten Lords a-Leaping
Eleven Pipers Piping
Twelve Drummers Drumming
ファイル2
I was born, the red planet, I am hungry, on Mars
I love frogs, they are so tasty, with gold sun, red ketchup
結果ファイル
A Partridge in a Pear Tree
Two Turtle Doves
I was born
the red planet
I am hungry
on Mars
Three French Hens
Four Calling Birds
I love frogs
they are so tasty
with gold sun
red ketchup
Five Gold Rings
Six Geese a-Laying
Seven Swans a-Swimming
Eight Maids a-Milking
Nine Ladies Dancing
Ten Lords a-Leaping
Eleven Pipers Piping
Twelve Drummers Drumming
詳細:
- 出力ファイルでは、file1の2行ごとにFile2フィールドに4行の追加行が作成されます。
- file1 は、内容に関係なく、2 行のカプラーに分割されます。
- file2の1行には4つのグループ(3つのカンマなど)があります。
- 出力ファイルにカンマがありません
- file2のグループには固定数のフィールドがあります。
- file1 と file2 は任意に長くできます。
- file2 は常に file1 より小さい。
カンマ区切りのFile2フィールドは、常に各レコードに同じ順序(3、3、3、2)で表示されます。つまり、$1 $2 $3、$4 $5 $6、$7 $8 $9、$10 S11
出力ファイルで、次のようにソートします。
梨の木に眠る
山鳩2匹
$1 $2 $3
$4 $5 $6
$7 $8 $9
$10S11
フランスの鶏3匹
4匹のおむつは鳥です
私はカエルが大好き
彼らはおいしいです
黄金色の太陽と
赤いトマトソース
五つの金輪
ガチョウ6匹が卵を産む
七匹の白鳥が泳いでいる
8人のメイド搾乳
踊る9人の女性
テンロードジャンプ
イレブンパイパースパイプ
12人のドラマーが北を打っている
- あるファイルの終わりに達したが他のファイルにまだデータがある場合は、目的の動作が指定されていません。残りのデータ(file1の)は変更されずに印刷されます。
どうすればいいですか?
答え1
file1
あなたの例では、5行目が早すぎると思います。
私の言葉が正しい場合は、次のスニペットを試してください。
awk '(NR+1)%2{print $0;getline<"file2";n=split($0,a,", ");if(n>1)for(i in a)print a[i];next}1' file1
出力:
A Partridge in a Pear Tree
Two Turtle Doves
I was born
the red planet
I am hungry
on Mars
Three French Hens
Four Calling Birds
I love frogs
they are so tasty
with gold sun
red ketchup
Five Gold Rings
Six Geese a-Laying
Seven Swans a-Swimming
Eight Maids a-Milking
Nine Ladies Dancing
Ten Lords a-Leaping
Eleven Pipers Piping
Twelve Drummers Drumming
答え2
上記の意見に加えて(希望する場合)アッスクリプト
awk -F', ' '1;!(NR%2)&&(getline <"file2")>0{$1=$1;print}' OFS='\n' file1
どこ
1
- 同義語{print $0}
:- 状況=
true
(1
)、 - 行動指定しない場合 =
default
(print
), - 印刷パラメータなし=
print $0
- 状況=
!(NR%2)
- 偶数行の場合:NR
-窒素数量右彩(記録)%
- 2で割った残りを計算し、!
- 結果反転
&&
- 論理AND
getline <"file2"
$0
- で行を読むファイル2そしてそれをフィールドに分けてください。F生産するS区切り文字はオプションとして表示され、成功すると返され-F=', '
ます。1
$1=$1
- サポートコツ酸素出力F生産するSeperator: フィールドについて何かをする必要があります。それ以外の場合は$0
そのまま印刷されます。