合并两个文本文件的具体位置

时间:2009-10-24 12:12:44

标签: linux bash sed

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

File_1.txt

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

File_2.txt

1993.0
1994.0
1995.0

的Result.txt

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

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

6 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

为什么,当然要使用cutpaste!试一试:

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

答案 2 :(得分:3)

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

paste test1.txt test2.txt  | awk '{print $1,$2,$5,$3,$4}'

答案 3 :(得分:1)

这是一个没有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

答案 4 :(得分:1)

由于这个问题用'sed'标记,这里是使用sed代替awk的Vereb答案的变体:

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

答案 5 :(得分:0)

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

#/usr/local/bin/perl

open(TXT2, pop(@ARGV));

while (<>) {
    chop($m = <TXT2>);

    s/^((\w+\s+){2})/$1$m /;

    print;
}