论坛风格切换切换到宽版
  • 718阅读
  • 6回复

[问题求助]shell编程 文件 [复制链接]

上一主题 下一主题
离线aaer.
 
发帖
2090
C币
-152446
威望
394
贡献值
1
银元
-6
铜钱
4772
人人网人气币
0
只看楼主 倒序阅读 使用道具 楼主  发表于: 2009-05-01
文件1:
test_1111.:GTcGA9EYxnlbU电脑
t.est_4324324.32:GTcGA9EYxnlbU电脑
pay_.:AtrwCbyNn8ZvI--- 印刷

文件2:
#Pay users
pay_1236ULq2ZLY/e0shttp://upload.bbs.csuboy.com/Mon_1004/126_6974_3b01f95722f71e9.gif[/img].
pay_222pXgLR05wNfV6http://upload.bbs.csuboy.com/Mon_1004/126_6974_df017f5679398c9.gif[/img](        游戏          )

#Test users
test_1111:GTcGA9EYxnlb.U           女人
test_222:Atrw.CbyNn8ZvI           女人

文件3:
pay_group:1:default,pay_111,pay_111e,pay_222,pay_333http://upload.bbs.csuboy.com/Mon_1004/126_6974_df017f5679398c9.gif[/img]             电子
test_group:1,default,test_111,test_222http://upload.bbs.csuboy.com/Mon_1004/126_6974_df017f5679398c9.gif[/img]外贸

问题描述:
把文件1中的内.容分别放到文件2和文件3中,.用shell脚本实现             电子
把文件1中的记录根据.“_”取值,最.后的结果是(请注意看粗体的部分)--- 印刷
文件2:
#Pay users
pay_1236ULq2ZLY/e0shttp://upload.bbs.csuboy.com/Mon_1004/126_6974_3b01f95722f71e9.gif[/img]           建材
pay_222pXgLR05wNfV6http://upload.bbs.csuboy.com/Mon_1004/126_6974_df017f5679398c9.gif[/img]--- 印刷
pay_:AtrwCbyN.n8ZvI.

#Test users
test_1111:GTcG.A9EYxnlbU.
test_222:.AtrwCbyNn8ZvI           建材
test_1111:GTcGA9EYxnlb.U.
test_4324.32432:GTcG.A9EYxnlbU教育

文件3:
pay_group:1:default,pay_111,pay_111e,pay_222,pay_333http://upload.bbs.csuboy.com/Mon_1004/126_6974_df017f5679398c9.gif[/img],pay_:AtrwCbyNn8ZvI             汽车
test_group:1,default,test_111,test_222http://upload.bbs.csuboy.com/Mon_1004/126_6974_df017f5679398c9.gif[/img],test_1111:GTcGA9EYxnlbU,test_432432432:GTcGA9EYxnlbU.

评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
离线58008839.
发帖
1973
C币
-235726
威望
381
贡献值
1
银元
0
铜钱
4410
人人网人气币
0
只看该作者 沙发  发表于: 2010-04-14
Re:shell编程
没有看到你说的意思是什么,要达到什么目的

离线domin.
发帖
2039
C币
-140119
威望
374
贡献值
1
银元
-3
铜钱
4565
人人网人气币
0
只看该作者 板凳  发表于: 2010-04-14
Re:shell编程


QUOTE:$ cat file1
test_1111:GTcGA9EYxnlbU
test_432432432:GTcGA9EYxnlbU
pay_:AtrwCbyNn8ZvI
$
$ cat file2
#Pay users
pay_123:6ULq2ZLY/e0s
pay_222:pXgLR05wNfV6

#Test users
test_1111:GTcGA9EYxnlbU
test_222:AtrwCbyNn8ZvI
$
$ cat file3
pay_group:1:default,pay_111,pay_111e,pay_222,pay_333
test_group:1,default,test_111,test_222

awk -F ':' 'BEGIN{

    while (getline) {

        if (FILENAME=="file1") {

        if ($1 ~ /test/) { test[++t]=$0; continue;}

        else if ($1 ~ /pay/) { pay[++p]=$0; continue;}

        }



        if ($0 ~ /Pay users/) {pb=1;tb=0;print;continue}

        if ($0 ~ /Test users/) {tb=1;pb=0;print;continue}

        if (pb && $0 ~ /^ *$/) {

            for (i in pay) print pay;

        }

        if (tb && (FILENAME == "file3" || $0 ~ /^ *$/)) {

            for (i in test) print test;

        }

        if (FILENAME == "file3") {

            pb=tb=0;

            if ($1 ~ /pay_group/) {

                printf $0 > "new_file3";

                for (i in pay) printf ","pay > "new_file3";

                printf "\n" > "new_file3";

            }

            else if ($1 ~ /test_group/ ) {

                printf $0> "new_file3";

                for (i in test) printf ","test > "new_file3";

                printf "\n" > "new_file3";

            }

            continue;

        }

        print;

    }

}' file1 file2 file3 >new_file2
复制代码


QUOTE:$ cat new_file2
#Pay users
pay_123:6ULq2ZLY/e0s
pay_222:pXgLR05wNfV6
pay_:AtrwCbyNn8ZvI

#Test users
test_1111:GTcGA9EYxnlbU
test_222:AtrwCbyNn8ZvI
test_1111:GTcGA9EYxnlbU
test_432432432:GTcGA9EYxnlbU
$
$ cat new_file3
pay_group:1:default,pay_111,pay_111e,pay_222,pay_333,pay_:AtrwCbyNn8ZvI
test_group:1,default,test_111,test_222,test_1111:GTcGA9EYxnlbU,test_432432432:GTcGA9EYxnlbU


发帖
2121
C币
-139044
威望
401
贡献值
1
银元
-2
铜钱
4708
人人网人气币
0
只看该作者 地板  发表于: 2010-04-14
Re:shell编程
我是一个linux的初学者,awk看不太懂,可不可以永shell的脚本写

离线linyanqi.
发帖
2152
C币
-604665
威望
405
贡献值
2
银元
-1
铜钱
4817
人人网人气币
0
只看该作者 4楼 发表于: 2010-04-14
Re:shell编程
一般涉及到这种处理的,都会用到sed或者awk,在shell脚本里面用就可以

离线chenqikj.
发帖
1919
C币
-235901
威望
359
贡献值
1
银元
-1
铜钱
4245
人人网人气币
0
只看该作者 5楼 发表于: 2010-04-14
Re:shell编程


QUOTE:原帖由 hellosa 于 2008-12-10 09:26 发表
我是一个linux的初学者,awk看不太懂,可不可以永shell的脚本写

shell我也不熟。
#!/bin/bash



exec 4>new_file2

exec 5>new_file3



FILE1=file1

FILE2=file2

FILE3=file3

test_=()

pay=()

t=0

p=0



while read line; do

    if [[ "${line}" =~ "test" ]]; then

        test_[$t]="${line}"

        t=$((t+1))

    fi;



    if [[ "${line}" =~ "pay" ]]; then

        pay[$p]="${line}"

        p=$((p+1))

    fi;

done <${FILE1}



while read line; do

    if [[ "${line}" =~ "Pay users" ]]; then

        pb=1

        t=$((t+1));

    fi;



    if [[ "${line}" =~ "Test users" ]]; then

        tb=1

    fi;

    if [[ "${line}" =~ "^ *$" && $tb == 1 ]]; then

        for i in ${test_[@]}; do

            echo $i >&4

        done

        tb=2 #has been output

    fi



    if [[ "${line}" =~ "^ *$" && $pb == 1 ]]; then

        for i in ${pay[@]}; do

            echo $i>&4

        done

        pb=2 #has been output

    fi



    echo "${line}" >&4

done <${FILE2}

if [[ $pb != 2 ]]; then

    for i in ${pay[@]}; do

        echo $i >&4

    done

fi



if [[ $tb != 2 ]]; then

    for i in ${test_[@]}; do

        echo $i >&4

    done

fi



while read line; do

    OLDIFS=${IFS}

    IFS=','



    [[ "${line}" =~ "pay_group" ]] && line="${line},${pay[*]}"

    [[ "${line}" =~ "test_group" ]] && line="${line},${test_[*]}"



    IFS="${OLDIFS}"



    echo "${line}" >&5

done <${FILE3}



exec 4>&-

exec 5>&-
复制代码

离线linyanqi.
发帖
2152
C币
-604665
威望
405
贡献值
2
银元
-1
铜钱
4817
人人网人气币
0
只看该作者 6楼 发表于: 2010-04-14
andy兄台谦虚了 这也叫不熟?
快速回复
限100 字节
如果您在写长篇帖子又不马上发表,建议存为草稿
 
上一个 下一个