Jak mogę scalać pliki po linii?

20

cat file1

foo
ice
two

cat file2

bar
cream
hundred

Pożądane dane wyjściowe:

foobar
icecream
twohundred

plik1 i plik2 zawsze będą miały taką samą liczbę linii w moim scenariuszu, na wypadek gdyby było łatwiej.

    
zadawane TuxForLife 30.04.2015, 03:52
źródło

5 odpowiedzi

31

Prawidłowym narzędziem dla tego zadania jest prawdopodobnie paste

paste -d '' file1 file2

Zobacz man paste , aby uzyskać szczegółowe informacje.

    
odpowiedział steeldriver 30.04.2015, 03:56
źródło
8

Poprzez awk way:

awk '{getline x<"file2"; print $0x}' file1
  • getline x<"file2" czyta całą linię z file2 i przechowuje zmienną x .
  • print $0x wypisuje całą linię z plik1 za pomocą $0 , a następnie x , która jest zapisaną linią plik2 .
odpowiedział sddgob 30.04.2015, 22:39
źródło
4

paste jest sposobem na przejście . Jeśli chcesz sprawdzić inne metody, oto rozwiązanie 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()

Jeśli masz kilka linii:

#!/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)))

Zwróć uwagę, że w przypadku nierównej liczby linii, ta ostatnia zakończy się na ostatnim wierszu pliku, który kończy się jako pierwszy.

    
odpowiedział heemayl 30.04.2015, 12:27
źródło
3

Również z czystym bash (zauważ, że to całkowicie zignoruje puste linie):

#!/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
    
odpowiedział kos 30.04.2015, 04:59
źródło
2

Droga perla, łatwa do zrozumienia:

#!/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";
}

Zacznij od:

./merge file1 file2

Wynik:

foobar
icecream
twohundred
    
odpowiedział A.B. 08.05.2015, 09:33
źródło

Przeczytaj inne pytania na temat tagów