Как я могу объединить файлы на линию за линией основание?

кошка file1

foo
ice
two

кошка file2

bar
cream
hundred

Желаемый вывод:

foobar
icecream
twohundred

file1 и file2 будут всегда иметь ту же сумму строк в моем сценарии, в случае, если это делает вещи легче.

22
задан 7 October 2016 в 10:14

5 ответов

Правильный инструмент для этого задания, вероятно paste

paste -d '' file1 file2

, См. man paste для деталей.

<час>

Вы могли также использовать эти pr команда:

pr -TmJS"" file1 file2

, где

  • -T выключает разбиение на страницы
  • -mJ файлы m erge, , сплошные линии J oining
  • -S"" разделяют столбцы с пустой строкой
<час>

, Если Вы действительно хотели сделать это с помощью чистой оболочки удара (не рекомендуемый), тогда это - то, что я предложил бы:

while IFS= read -u3 -r a && IFS= read -u4 -r b; do 
  printf '%s%s\n' "$a" "$b"
done 3<file1 4<file2

(Только включая это, потому что предмет подошел в комментариях к другому предложенному решению чистого удара.)

34
ответ дан 23 November 2019 в 01:32

paste способ пойти . Если Вы хотите проверить некоторые другие методы, вот python решение:

#!/usr/bin/env python2
import itertools
with open('/path/to/file1') as f1, open('/path/to/file2') as f2:
    lines = itertools.izip_longest(f1, f2)
    for a, b in lines:
        if a and b:
            print a.rstrip() + b.rstrip()
        else:
            if a:
                print a.rstrip()
            else:
                print b.rstrip()

, Если у Вас есть немногие количество строк:

#!/usr/bin/env python2
with open('/path/to/file1') as f1, open('/path/to/file2') as f2:
    print '\n'.join((a.rstrip() + b.rstrip() for a, b in zip(f1, f2)))

Примечание, что для неравного количества строк, этот закончит в последней строке файла, который заканчивается сначала.

4
ответ дан 23 November 2019 в 01:32

Кроме того, с чистым bash (замечают, что это полностью проигнорирует пустые строки):

#!/bin/bash

IFS=\n' GLOBIGNORE='*'
f1=($(< file1))
f2=($(< file2))
i=0
while [ "${f1[${i}]}" ] && [ "${f2[${i}]}" ]
do
    echo "${f1[${i}]}${f2[${i}]}" >> out
    ((i++))
done
while [ "${f1[${i}]}" ]
do
    echo "${f1[${i}]}" >> out
    ((i++))
done
while [ "${f2[${i}]}" ]
do
    echo "${f2[${i}]}" >> out
    ((i++))
done
3
ответ дан 23 November 2019 в 01:32

Через путь:

awk '{getline x<"file2"; print $0x}' file1
  • getline x<"file2" читает всю строку из file2 и содержит в x переменную.
  • print $0x печатает целую строку от file1 при помощи $0 затем x который является сохраненной строкой file2.
8
ответ дан 23 November 2019 в 01:32

Жемчуг путь, легкий понять:

#!/usr/bin/perl
$filename1=$ARGV[0];
$filename2=$ARGV[1];

open(my $fh1, "<", $filename1) or die "cannot open < $filename1: $!";
open(my $fh2, "<", $filename2) or die "cannot open < $filename2: $!";

my @array1;
my @array2;

while (my $line = <$fh1>) {
  chomp $line;
  push @array1, $line;
}
while (my $line = <$fh2>) {
  chomp $line;
  push @array2, $line;
}

for my $i (0 .. $#array1) {
  print @array1[$i].@array2[$i]."\n";
}

Запустите с:

./merge file1 file2

Вывод:

foobar
icecream
twohundred
2
ответ дан 23 November 2019 в 01:32

Другие вопросы по тегам:

Похожие вопросы: