CLI 将两个不均匀列表组合在两个不同的文件中

CLI combining two uneven lists in two different files

我一直在寻找一种方法来合并两个不均匀的文件,我知道有一个 awk 解决方案,但我无法修改它以满足我的需要。即

文件 1

a
b
c
d

文件 2

1
2

解决方案

a:1
b:2
c:1
d:2

如果第一个文件是10个字,第二个只有3个字,重复这3个字直到第一个文件结束EOF,我确定那里有一个带':'的分隔符标志。

我最好的尝试是:

paste -d file1 /dev/null file2 > new_file

但这只是将 1,2 放入新列表中,但没有重复。

对于给定的样本数据,你可以试试这个awk:

awk 'FNR == NR{a[++n]=; next} {print  ":" a[(FNR-1) % n + 1]}' file2 file1

a:1
b:2
c:1
d:2

这可能适合您 (GNU sed):

sed -E '1{x;s/.*/cat file2/e;x};G;s/\n/:/;P;x;s/([^\n]*)\n(.*)/\n/;x;d' file1

使用 file2 的内容准备保留 space。

将 file2 追加到当前行,用 : 替换第一个换行符并仅打印第一行。

返回等待space并循环第一行。

删除当前行并重复。

使用是和粘贴的替代方法:

yes "$(cat file2)" | sed 'R /dev/stdin' file1 | paste -sd':\n'

或没有 sed:

yes "$(cat file2)" | head -$(wc -l <file1) | paste -sd':\n' file1 - 

N.B。最后的-表示循环file2的内容

使用您显示的示例,请尝试以下 awk 代码。

awk '
FNR==NR{
  arr[++count1]=[=10=]
  next
}
{
  print [=10=]":"arr[++count2]
  count2=(count2==count1?0:count2)
}
' file2 file1

说明:为以上代码添加详细说明。

awk '                         ##Starting awk program from here.
FNR==NR{                      ##Checking condition FNR==NR when file2 is being read.
  arr[++count1]=[=11=]            ##Creating arr array with index of count1(increasing it with 1) and value is current line.
  next                        ##next will skip all further statements from here.
}
{
  print [=11=]":"arr[++count2]    ##Printing current line colon and value of arr with index of ++count2.
  count2=(count2==count1?0:count2)  ##Setting count2 to 0 if its eqal to count1 else keeping it as it is.
}
' file2 file1                 ##Mentioning Input_file names here.