2つの巨大なファイルがあり、2つのファイルの行数が等しくありません。
ファイル1
61346877
41724134
85406965
59647779
25199749
86213
45417131
41905714
19415458
1828594
56543876
70603415
ファイル2
212
1231
324234
213
希望の出力
61346877,212
41724134,1231
85406965,324234
59647779,213
25199749,212
86213,1231
45417131,324234
41905714,213
19415458,212
1828594,1231
56543876,324234
70603415,213
答え1
大きな打撃:
size1=$( wc -l < file1 )
size2=$( wc -l < file2 )
i=0
while (( i < size1 )); do
cat file2
(( i += size2 ))
done | paste -d, file1 - | head -n $size1
head
file1のサイズがfile2の偶数倍数でない場合は、入力をパイプします。
出力
61346877,212
41724134,1231
85406965,324234
59647779,213
25199749,212
86213,1231
45417131,324234
41905714,213
19415458,212
1828594,1231
56543876,324234
70603415,213
3行のawkプログラム
awk -v OFS=, '
# read the smaller file into memory
NR == FNR {size2++; file2[FNR] = $0; next}
# store the last line of the array as the zero-th element
FNR == 1 && NR > 1 {file2[0] = file2[size2]}
# print the current line of file1 and the corresponding file2 line
{print $0, file2[FNR % size2]}
' file2 file1
答え2
file2のすべての行を読み取ると、file2の重複内容が残ります。以下は、file2の行数を変数として取り、ファイルの総行数を確認するたびにリセットされるカウンタに基づいてfile2の行を印刷するawk
/ソリューションです。sed
$ awk -v file2lines=$(wc -l file2 | cut -f1 -d' ') 'BEGIN{count=1} {if(count > file2lines) count=1; printf $1",";system("sed -n -e "count"p file2");count++}' file1
61346877,212
41724134,1231
85406965,324234
59647779,213
25199749,212
86213,1231
45417131,324234
41905714,213
19415458,212
1828594,1231
56543876,324234
70603415,213
答え3
使いやすいawk
;)
awk 'FNR==NR{a[i++]=$0; max=i; next} {if ((NR % max) == 0) {i=max-1} else {i=(NR%max) - 1}; printf "%s,%s\n",$0,a[i]}' file2 file1
出力例
61346877,212
41724134,1231
85406965,324234
59647779,213
25199749,212
86213,1231
45417131,324234
41905714,213
19415458,212
1828594,1231
56543876,324234
70603415,213