Слияние двух текстовых файлов определенной позиции - PullRequest
1 голос
/ 24 октября 2009

Мне нужно объединить два файла скриптом 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

Файл_2.txt необходимо объединить в этой конкретной позиции. Я пробовал разные решения с несколькими циклами do while, но они пока не работают ..

Ответы [ 6 ]

5 голосов
/ 24 октября 2009
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
3 голосов
/ 25 октября 2009

Это было вдохновлено ответом Денниса Уильямсона, так что если вам это нравится, дайте там тоже +1!

paste test1.txt test2.txt  | awk '{print $1,$2,$5,$3,$4}'
3 голосов
/ 24 октября 2009

Почему, конечно, используйте cut и paste! Попробуйте это:

paste -d" " <(cut -d" " -f 1-2 File_1.txt) File_2.txt <(cut -d" " -f 3-4 File_1.txt)
1 голос
/ 25 октября 2009

Поскольку вопрос был помечен как «sed», вот вариант ответа Вереба с использованием sed вместо awk:

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

Или в чистом виде ...: D

sed -r '/ /{H;d};G;s/^([^\n]*)\n*([^ ]* [^ ]*)/\2 \1/;P;s/^[^\n]*\n//;x;d' File_1.txt File_2.txt
1 голос
/ 24 октября 2009

Это решение без 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 голосов
/ 24 октября 2009

Используя perl, укажите file1 и file2 в качестве аргументов для:

#/usr/local/bin/perl

open(TXT2, pop(@ARGV));

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

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

    print;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...