2009-10-24 84 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