合并两个具有不同行数的不同文件

合并两个具有不同行数的不同文件

我有两个巨大的文件,两个文件中的行数不相同。

文件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

相关内容