【问题标题】:Merge two text files specific position合并两个文本文件特定位置
【发布时间】:2009-10-24 12:12:43
【问题描述】:

我需要用 Bash 脚本合并两个文件。

文件_1.txt

TEXT01 TEXT02 TEXT03 TEXT04
TEXT05 TEXT06 TEXT07 TEXT08
TEXT09 TEXT10 TEXT11 TEXT12

文件_2.txt

1993.0
1994.0
1995.0

结果.txt

TEXT01 TEXT02 1993.0 TEXT03 TEXT04
TEXT05 TEXT06 1994.0 TEXT07 TEXT08
TEXT09 TEXT10 1995.0 TEXT11 TEXT12

File_2.txt 需要在这个特定位置合并。我已经尝试了多个 do while 循环的不同解决方案,但到目前为止它们还没有奏效..

【问题讨论】:

    标签: linux bash sed


    【解决方案1】:
    awk '{
     getline s3 < "file1"
     printf "%s %s %s ",$1,$2,s3
     for(i=3;i<=NF;i++){
        printf "%s ",$i
     }
     print "" 
    }END{close(s3)}' file
    

    输出

    # more file
    TEXT01 TEXT02 TEXT03 TEXT04
    TEXT05 TEXT06 TEXT07 TEXT08
    TEXT09 TEXT10 TEXT11 TEXT12
    $ more file1
    1993.0
    1994.0
    1995.0
    $ ./shell.sh
    TEXT01 TEXT02 1993.0 TEXT03 TEXT04
    TEXT05 TEXT06 1994.0 TEXT07 TEXT08
    TEXT09 TEXT10 1995.0 TEXT11 TEXT12
    

    【讨论】:

    • 看,awk 的优雅 :)
    【解决方案2】:

    当然,使用cutpaste!试试这个:

    paste -d" " <(cut -d" " -f 1-2 File_1.txt) File_2.txt <(cut -d" " -f 3-4 File_1.txt)
    

    【讨论】:

      【解决方案3】:

      这受到丹尼斯威廉姆森的回答的启发,所以如果你喜欢它,也给它+1!

      粘贴 test1.txt test2.txt | awk '{打印 $1,$2,$5,$3,$4}'

      【讨论】:

        【解决方案4】:

        这是一个没有 awk 的解决方案。
        有趣的是如何在 bash 中使用文件描述符。

        #!/bin/sh exec 5<test2.txt # open file descriptor 5 cat test1.txt | while read ln do read ln2 <&5 #change this three lines as you wish: echo -n "$(echo $ln | cut -d ' ' -f 1-2) " echo -n "$ln2 " echo $ln | cut -d ' ' -f 3-4 done exec 5>&- # Close fd 5

        【讨论】:

        • +1 表示文件描述符,-1 表示无用的 cat。此外,对于大文件,在循环内为输入文件的每一行执行两次剪切可能会非常慢。我会改用 Bash 的分词方式。
        • 回显可以改为:array=( ${ln} ) echo "${array[0]} ${array[1]} $ln2 ${array[2]} ${数组[3]}"
        • s/directory/directly/ 也许?
        【解决方案5】:

        由于问题被标记为“sed”,因此这里是 Vereb 使用 sed 而不是 awk 的答案的变体:

        paste File_1.txt File_2.txt | sed -r 's/( [^ ]* [^ ]*)\t(.*)/ \2\1/'
        

        或者在纯 sed ... :D

        sed -r '/ /{H;d};G;s/^([^\n]*)\n*([^ ]* [^ ]*)/\2 \1/;P;s/^[^\n]*\n//;x;d' File_1.txt File_2.txt
        

        【讨论】:

          【解决方案6】:

          使用 perl,将 file1 和 file2 作为参数:

          #/usr/local/bin/perl
          
          open(TXT2, pop(@ARGV));
          
          while (<>) {
              chop($m = <TXT2>);
          
              s/^((\w+\s+){2})/$1$m /;
          
              print;
          }
          

          【讨论】:

          • 为什么是chomp而不是chomp?
          • 您将不得不询问 Larry Wall :-) Chop 删除读入 $m 的行的换行符(最后一个字符)。
          • chop 删除最后一个字符,不管它是什么。 chomp 删除尾随换行符,但不做其他任何事情。
          • 啊,对于脚本,我倾向于坚持 Perl 4 语法 :-)
          猜你喜欢
          • 1970-01-01
          • 2017-01-29
          • 1970-01-01
          • 1970-01-01
          • 2012-04-15
          • 2011-12-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多