0

我正在尝试编写一个程序,该程序将打印出文件中的每一行,并在最后添加该文件的另一行,基本上从每行的一部分创建对。如果这条线是相同的,它将什么都不做。此外,它必须避免重复相同的对。AB 与 BA 相同

简而言之

文件输入:

otherstuff A
otherstuff B     
otherstuff C 
otherstuff D

输出:

A B
A C
A D
B C
B D
C D

我试图用 BASH 脚本来做到这一点,但遇到了麻烦,因为我无法让我的嵌套 while 循环工作。它会读取第一行,将其与其他行进行比较,然后停止(基本上只输出上面示例输出中的前 3 行,外部 while 循环只运行一次)。

我也怀疑我可以使用 MATLAB 来做到这一点,所以也欢迎使用它的建议。

这是迄今为止我拥有的 bash 脚本。正如我所说,它对我来说没有正确打印出来,因为外循环只运行一次。

#READS IN file from terminal
FILE1=$1
#START count at 0
count0=
exec 3<&0
exec 0< $FILE1

while read LINEa; do    
while read LINEb; do

    eventIDa=$(echo $LINEa | cut -c20-23)
    eventIDb=$(echo $LINEb | cut -c20-23)
    echo $eventIDa $eventIDb
done
done    
4

2 回答 2

1

使用 bash:

#!/bin/bash

[ -f "$1" ] || { echo >&2 "File not found"; exit 1; }

mapfile -t lines < <(cut -c20-23 <"$1" | sort | uniq)

for i in ${!lines[@]}; do
    elem1=${lines[$i]}
    unset lines[$i]
    for elem2 in "${lines[@]}"; do
        echo "$elem1" "$elem2"
    done
done

这将读取在命令行上作为参数给出的文件,对重复项进行排序和过滤,并输出所有组合。您可以修改参数cut以适应您的特定输入文件。

由于您似乎缩进使用cut的特殊方式,您上面的输入示例将不起作用。相反,请使用具有正确行长的东西,例如:

123456789012345678 A
123456789012345678 B
123456789012345678 C
123456789012345678 D
于 2013-05-03T17:06:38.140 回答
0

假设其他东西不相关(否则你当然可以稍后添加它)这应该在 Matlab 中起到作用:

 combnk({'A' 'B' 'C' 'D'},2)
于 2013-05-03T16:09:39.810 回答