V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
fsckzy
V2EX  ›  Linux

shell 合并两个文件

  •  1
     
  •   fsckzy · 2018-01-05 15:58:27 +08:00 · 4078 次点击
    这是一个创建于 2498 天前的主题,其中的信息可能已经有所发展或是发生改变。
    a 文件:
    10.200.187.81
    10.200.187.82
    10.200.187.83

    b 文件:
    root
    bin
    daemon
    root
    bin
    daemon
    root
    bin
    daemon

    要求输出:
    http://upload.ouliu.net/i/20180105155504cdzxx.png
    请教一下我,谢谢!
    22 条回复    2018-01-06 15:03:57 +08:00
    anthow
        1
    anthow  
       2018-01-05 16:04:53 +08:00
    不会 shell 的话,用其他脚本不分分钟干完。。。
    fsckzy
        2
    fsckzy  
    OP
       2018-01-05 16:07:04 +08:00
    @anthow 那指导一下我吧
    lslqtz
        3
    lslqtz  
       2018-01-05 16:21:23 +08:00 via iPhone
    不会 shell,我的思路是取中间数,然后按给定的空格输出,到指定的中间行数时先输出 IP
    eccstartup
        4
    eccstartup  
       2018-01-05 16:27:47 +08:00 via iPhone
    问题不太明确
    privil
        5
    privil  
       2018-01-05 16:28:41 +08:00
    ……不算是两个文件 = =

    我随手写一个试试
    ```
    #!/bin/bash

    cat >>c <<eof
    root
    $i bin
    daemon

    eof
    done
    ```
    怎么对齐你自己看着办 = =
    aristotll
        6
    aristotll  
       2018-01-05 16:29:11 +08:00
    @eccstartup #4 的确 建议用 python 写非常简单如果你需求可以的话
    privil
        7
    privil  
       2018-01-05 16:29:15 +08:00
    #!/bin/bash

    for i in $(cat a);do
    cat >>c <<eof
    root
    $i bin
    daemon

    eof
    done

    我擦,少了一行 = =
    veelog
        8
    veelog  
       2018-01-05 16:29:54 +08:00 via iPhone
    awk '{print "";print $0;print ""}' a.log|paste -d"" - b.log
    lululau
        9
    lululau  
       2018-01-05 16:30:14 +08:00
    连规则都懒得描述吗。。。

    嗟!来食:

    paste <(gsed -n 'x;p;x;G;p' a) b
    veelog
        10
    veelog  
       2018-01-05 16:31:18 +08:00 via iPhone
    cat b.log|paste a.log - - -
    这种格式更好点吧
    sutra
        11
    sutra  
       2018-01-05 16:32:45 +08:00
    cat a | awk '{printf "\t\n%s\t\n\t\n", $1}' | paste -d " " - b
    omph
        12
    omph  
       2018-01-05 16:33:16 +08:00
    输出的是个表格。
    是不是 A 的 1 行对应 B 的 3 行?
    privil
        13
    privil  
       2018-01-05 16:40:12 +08:00
    @sutra #11 cat a | awk '{printf "#""\t\n%s\t\n""#""\t\n", $1}' | paste -d " " - b|column -t|sed 's/#/ /' 改进了下,对齐了= =
    cls1991
        14
    cls1991  
       2018-01-05 16:59:31 +08:00
    awk '{printf "\t\t\n%s\t\n\t\t\n", $1}' a.txt | paste -d ' ' - b.txt | awk ' {print;} NR % 3 == 0 { print ""; }'

    `
    root
    10.200.187.81 bin
    daemon

    root
    10.200.187.82 bin
    daemon

    root
    10.200.187.83 bin
    daemon
    `
    应该跟需求一样了。
    Lpl
        15
    Lpl  
       2018-01-05 17:11:41 +08:00
    ```
    #!/bin/bash

    rm c.txt

    ans=1
    while read LINE
    do
    read -a items <<< $LINE
    for ((i=0; i<3; i++))
    do
    tmp=`sed -n -e "$((${ans}+${i}))p" b.txt`

    if [ ${i} = 1 ]; then
    echo -e "${items[@]}\t\t${tmp}" >> c.txt
    else
    echo -e "\t\t\t${tmp}" >> c.txt
    fi
    done

    let ans+=3;
    done < a.txt

    cat c.txt | expand -t 8 >d.txt
    mv d.txt c.txt
    ```

    结果:
    Lpl
        16
    Lpl  
       2018-01-05 17:12:33 +08:00
    上述第三行的
    rm c.txt

    修改为

    cat /dev/null > c.txt
    Lpl
        17
    Lpl  
       2018-01-05 17:15:44 +08:00
    @sutra 我也改进下,cat a | awk '{printf "\t\n%s\t\n\t\n", $1}' | paste -d " " - b | expand -t 20 > d.txt
    对齐了...
    tees
        18
    tees  
       2018-01-05 17:25:46 +08:00
    @privil
    cat a | awk '{printf "#""\t\n%s\t\n""#""\t\n", $1}' | paste -d " " - b|column -t|sed 's/#/ /'|sed 'N;N;/^$/d;G'

    加个空行.
    veelog
        19
    veelog  
       2018-01-05 17:27:23 +08:00 via iPhone
    awk '{printf "%15 s\n%15 s\n%15 s\n", "",$0,"" }' a.log|paste -d"" - b.log
    sutra
        20
    sutra  
       2018-01-05 18:04:12 +08:00
    @privil @Lpl @tees 这个问题好像要被玩坏了。
    CEBBCAT
        21
    CEBBCAT  
       2018-01-05 20:05:59 +08:00
    一个问题不要发在两个节点喔!(目前)节点不是 Tag 的意思

    /t/420366
    /t/420375

    @Livid
    shihira
        22
    shihira  
       2018-01-06 15:03:57 +08:00
    来看大 vim 无敌工作流

    cp a.txt c.txt; vim -c 'e c.txt | exe "normal ggVyP" | s/./ /g | let @q="Pjpj" | exe "normal A \<esc>dd3@q" | w | e b.txt | exe "normal gg\<C-V>G$y" | e c.txt | exec "normal gg$p" | wq'

    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3118 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 13:06 · PVG 21:06 · LAX 05:06 · JFK 08:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.