我有两个巨大的文件,两个文件中的行数不相同。
文件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 重复的内容。这是一个awk
/sed
解决方案,它将 file2 中的行数作为变量,并根据计数器打印 file2 中的行,每次我们检查文件中的总行数时都会重置该计数器
$ 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