如何修改 bash 脚本来迭代所有可能的匹配对以获得所需的输出?

如何修改 bash 脚本来迭代所有可能的匹配对以获得所需的输出?

我需要迭代对象列表以获取所有可能的配对组合。我找到了以下脚本,它使用 Bash 中的列表工作。

set -- value1 value2 "value with spaces"
for a; do
    shift
    for b; do
        printf "%s - %s\n" "$a" "$b"
    done
done

我想修改它,不是从 bash 列表开始,而是从文件(txtcsv)开始,其中第一列是要合并的对象的名称,第二列是其他信息(我也想在输出中包含这些信息)。

输入文件:

ID,pKi
4a,10
4b,20
4c,30

预期输出文件:

ID1,ID2,pKi1,pKi2
4a,4b,10,20
4a,4c,10,30
4b,4c,20,30

答案1

将两个文件读入数组并使用相同的技术

mapfile -t lines < input.file
last_index=$(( ${#lines[@]} - 1))

echo "ID1,ID2,pKi1,pKi2"

for ((i = 1; i < last_index; i++)); do
    for ((j = i+1; j <= last_index; j++)); do
        printf '%s,%s\n' "${lines[i]}" "${lines[j]}"
    done
done \
| awk -F, -vOFS=, '{print $1,$3,$2,$4}'   # rearrange the fields

@Tommaso 报告:

该脚本有效,但我的输出是这样的:

4a,4b,6.93
,7.29
4a,4c,6.93
,8.4
4a,4d,6.93
,7.67

为什么最后一个变量 (pki2) 会换行?谢谢。

相关内容