我正在尝试编写一个程序,该程序将打印出文件中的每一行,并在最后添加该文件的另一行,基本上从每行的一部分创建对。如果线条相同,则无效。此外,它必须避免重复相同的对。 A B与B A相同
简而言之
的FileInput:
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
答案 0 :(得分: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
答案 1 :(得分:0)
假设其他填充不相关(否则您可以在以后添加它),这应该在Matlab中完成:
combnk({'A' 'B' 'C' 'D'},2)