LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1645|回复: 12

请教这个如何用shell实现

[复制链接]
发表于 2007-9-29 11:51:49 | 显示全部楼层 |阅读模式
各位,小弟最近遇到一个困惑的问题,类似于
要将:
A
B
C
D
...

转换为:
A B
A C
A D
B C
B D
C D
....
请教各位,如何用shell实现呢?
发表于 2007-9-29 20:25:57 | 显示全部楼层
try this one(默认输出到屏幕, 可以将输出重定向到某文件中):
  1. #!/bin/sh
  2. i=2     # 'b' at the second line
  3. cp $1 bck_file
  4. cat $1 | while read line
  5. do
  6.         sed -n "$i,$ p" bck_file > tmp_file
  7.         sed "s/^/$line /" tmp_file
  8.         i=$((i+1))
  9. done
  10. rm -f bck_file tmp_file
复制代码
用法:
$ test.sh <input file>
回复 支持 反对

使用道具 举报

发表于 2007-9-30 08:43:56 | 显示全部楼层
awk可以不?
  1. #!/bin/awk -f
  2. {
  3.         a[NR - 1] = $1;
  4. }
  5. END {
  6.         for (i = 0; i < NR - 1; i++) {
  7.         j = i + 1;
  8.         while (j < NR)
  9.                 printf("%s %s\n", a[i], a[j++]);
  10.         }
  11. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2007-9-30 13:20:58 | 显示全部楼层

  1. #!/bin/bash
  2. if [ "X$1" == "X" ];then
  3.   file=$(mktemp)
  4.   while read line
  5.   do
  6.     echo $line >>"$file"
  7.   done
  8. else
  9.   file="$1"
  10. fi

  11. lines=$(wc -l < "$file")
  12. for((i=1;i<(lines-1);i++))
  13. do
  14.   A=
  15.   B=
  16.   j=0
  17.   while read var
  18.   do
  19.     ((j++))
  20.     [ $j -le $i ] && A=$var
  21.     [ $j -gt $i ] && echo $A $var
  22.   done <"$file"
  23. done

  24. [ "X$1" == "X" ] && rm -f "$file"
复制代码
回复 支持 反对

使用道具 举报

发表于 2007-9-30 23:32:23 | 显示全部楼层
  1. #!/bin/bash
  2. set $(cat yourfile)
  3. for i
  4. do
  5.         shift
  6.         for x ; do
  7.                 echo $i $x
  8.         done
  9. done
复制代码
回复 支持 反对

使用道具 举报

发表于 2007-10-7 15:33:07 | 显示全部楼层
網中人老师,真的很佩服你的程序!
我还从别的地方看到了你的文章,真的很佩服,谢谢您了!
回复 支持 反对

使用道具 举报

发表于 2007-10-7 21:18:23 | 显示全部楼层
将楼主的要求修改了下, 加入空格:
1 2
3 4
5 6
7 8
然后将以上程序依次测试, 所得结果如下:
<chunchengfh>:
1 2 3 4
1 2 5 6
1 2 7 8
3 4 5 6
3 4 7 8
5 6 7 8
<hohoxu_hao115>:
1 3
1 5
1 7
3 5
3 7
5 7
<springwind426>:
1 2 3 4
1 2 5 6
1 2 7 8
3 4 5 6
3 4 7 8
<netman網中人>:
1 2
1 3
1 4
1 5
1 6
1 7
1 8
2 3
2 4
2 5
2 6
2 7
2 8
3 4
3 5
3 6
3 7
3 8
4 5
4 6
4 7
4 8
5 6
5 7
5 8
6 7
6 8
7 8
回复 支持 反对

使用道具 举报

发表于 2007-10-12 09:24:02 | 显示全部楼层
如果你修改了條件,那就要改寫囉。
如下是以 line 做單位的寫法:
  1. #!/bin/bash
  2. input=1.txt
  3. i=0
  4. while read line
  5. do
  6.         ((i++))
  7.         num[$i]=$line
  8. done < $input
  9. for ((x=1;i<=$i;x++))
  10. do
  11.         [ $x -gt $i ] && break
  12.         for ((y=$((x+1));y<=$i;y++))
  13.         do
  14.                 echo ${num[$x]} ${num[$y]}
  15.         done
  16. done
复制代码
回复 支持 反对

使用道具 举报

发表于 2007-10-12 10:32:27 | 显示全部楼层
以前只接触过"标准"的shell编程, 很多功能都是通过sed或者awk实现的, 还从来没用过bash的扩展功能.  (-:  似乎bash的数组也挺强大啊

To netman:
一点小疑问: 以下语句中的 "i<=$i" 似乎有点诡异, 好像也没什么用吧? 我试着将它改成了 "x<=$i", 然后将 "[ $x -gt $i ] && break" 删除, 也是可以的, 而且感觉更直观一点
for ((x=1;i<=$i;x++))
do
        [ $x -gt $i ] && break
回复 支持 反对

使用道具 举报

发表于 2007-10-12 10:42:46 | 显示全部楼层
对2楼自己的代码的更精简版本:
  1. #!/bin/sh
  2. i=2     # 'b' at the second line
  3. cat $1 | while read line
  4. do
  5.         sed -n "$i,$ p" $1 | sed "s/^/$line /"
  6.         i=$((i+1))
  7. done
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表