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.
我一直在寻找一种方法来合并两个不均匀的文件,我知道有一个 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.