2009-10-24 79 views
1

我需要用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循环,但他们并没有被目前的工作..

回答

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 
+0

看哪,awk的优雅:) – 2009-10-24 13:03:20

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 
 
+0

+1为文件描述符,-1为无用的猫。另外,对于输入文件的每一行,在循环内部进行两次剪切可能对于大文件来说非常慢。我会用Bash的分词来代替。 – 2009-10-24 14:27:47

+0

回声可以改为: \t array =($ {ln}) \t echo“$ {array [0]} $ {array [1]} $ ln2 $ {array [2]} $ {array [3 ]}“ – Vereb 2009-10-24 14:34:36

+1

你也可以读入数组目录。读-a arr – ghostdog74 2009-10-24 15:39:35

0

使用perl,给文件1和文件2作为参数:

#/usr/local/bin/perl 

open(TXT2, pop(@ARGV)); 

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

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

    print; 
} 
+0

为什么它被砍,而不是chomp? – ghostdog74 2009-10-24 15:42:54

+0

您将不得不问Larry Wall :-) Chop删除读取的行的换行符(最后一个字符)为$ m。 – rsp 2009-10-24 16:27:15

+0

'chop'删除最后一个字符,不管它是什么。 'chomp'删除了一个尾随的换行符,但除此之外什么都不做。 – ephemient 2009-10-24 18:11:38

3

为什么,使用cutpaste,当然!试试这个:

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

我添加了这个 – Vereb 2009-10-24 20:20:26

3

这是由丹尼斯威廉姆森的答案如此吸引,所以如果你喜欢它给那里+1也是!

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

+1的变体:这很聪明 – 2009-10-24 21:51:59

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