2014-10-20 22 views
9

File1:Bash wyjściowe polecenia pasta formatowania

1 
2 

PLIK2:

1 2 3 
4 5 

File3:

x x x 
yy yy 
zz 

paste file1 file2 file2 daje mi kartę oddzielone wyjście:

1  1 2 3 x x x 
2  4 5  yy yy 
       zz 

paste -d" " file1 file2 file3 daje mi wynik:

1 1 2 3 x x x 
2 4 5 yy yy 
    zz 

chcę go jak poniżej:

1 1 2 3 x x x 
2 4 5 yy yy 
     zz 

Każdy pomysł, jeśli jest to możliwe, czy powinienem spróbować żadnej innej komendy?

+0

A co jeśli druga linia 'file2' jest' 4 5 6 7 8'? Jaka jest pożądana moc wyjściowa? Czy celem jest posiadanie kolumny na plik wejściowy? –

+0

Celem jest użycie spacji jako separatora i zachowanie oryginalnego formatowania w każdym pliku. Przykro mi, nie dostałem twojego pytania o plik2. – Ramesh

+0

Twój problem został rozwiązany? Nie wynika to z twoich komentarzy. – fedorqui

Odpowiedz

5

Przydałoby sed po usunąć zakładki

paste file file2 file3 | sed 's/\t/ /' 

1 1 2 3 x x x 
2 4 5 yy yy 
     zz 

Oto skrypt awk ogólnego przeznaczenia, które będą działać na dowolnej liczbie pliku z jakiegokolwiek formatowania.

awk ' 
    {x=ARGIND;a[x]=a[x]>(b=length($0))?a[x]:b} 
    {F[FNR,x]=$0} 
    END{ 
      for(q=1;q<=FNR;q++) 
      { 
        for(i=1;i<=ARGC;i++) 
        { 
        printf("%-"a[i]"s ",F[q,i]) 
        }print "" 
      } 
    }' file{1,2,3,4) 
+0

Co zrobić, jeśli pliki mają zakładki na EOL? – lynxlynxlynx

+0

Nie, użycie nieużywanych ograniczników zachowałoby poziome układanie w poziomie. – lynxlynxlynx

+0

@Jidder, Tak, tego właśnie chciałem. W rzeczywistości próbowałem przekonwertować tabulatory na spacje, ale użyłem flagi "g" na końcu, która zawiodła moje wyniki. Korzystam teraz z twojego rozwiązania. Dzięki. – Ramesh

2

Tylko od was samych, wydaje się, że możecie spróbować najpierw dołączyć pliki 1 i 2, a następnie dołączyć do tego z plikiem 3, ale ze specjalnym ogranicznikiem, który zmienicie później na spację.

Nietestowane przykład:

paste -d" " file1 file2 | paste -d'|' - file3 | sed 's,|, ,g' 

Tutaj użyłem |, ale należy użyć coś wiesz na pewno nie pojawi się w czymś dane czyli jeszcze bardziej niejasne jak ˘. Trochę hackowania, ale powinno działać.

tylko przez dwa pliki:

paste -d'¤' file1 file2 | sed 's,¤, ,g' 
+0

Właściwie generuję polecenie wklejania i przypisuję je do zmiennej pastecmd i wykonuję je jako $ {pastecmd}, więc ta metoda nie jest dla mnie odpowiednia. Może być dowolna liczba plików lub przynajmniej jedna. – Ramesh

+1

Niewielka przeszkoda, wystarczy wygenerować polecenie, aby wziąć dwa pliki, a następnie zapętlić je wszystkie. Cały ten kod i dane mogą być zawarte w tej samej zmiennej, jeśli naprawdę tego potrzebujesz. Ale to już jest inne pytanie. – lynxlynxlynx

+0

Próbowałem, ale mam teraz inny problem. Kiedy wykonuję wygenerowane polecenie przy użyciu składni $ {pastecmd}, polecenie paste uważa, że ​​| to kolejny plik wejściowy.Próbowałem uciec, ale bez powodzenia. Wolałbym raczej eksplorować flagi poleceń wklejania i zobacz, jak to może być osiągalne. Dziękuję za Twój czas. – Ramesh

1

Czy tego rodzaju rzeczy szukasz?

$ more file{1,2,3,4} | cat 
:::::::::::::: 
file1 
:::::::::::::: 
1 
2 
:::::::::::::: 
file2 
:::::::::::::: 
1 2 3 
4 5 6 7 8 
:::::::::::::: 
file3 
:::::::::::::: 
x x x 
yy yy 
zz 
:::::::::::::: 
file4 
:::::::::::::: 
a a a 
bb bb bb 
c c cc 
d d d 
$ paste file{1,2,3,4} | sed -e 's/\t/ \t/g' | column -t -s$'\t' 
1 1 2 3  x x x a a a 
2 4 5 6 7 8 yy yy bb bb bb 
       zz  c c cc 
         d d d 
+0

Nie, potrzebuję, aby zakładki pomiędzy poszczególnymi plikami były konwertowane na pojedynczą spację. Myślę, że mogę uzyskać podobny wynik jak twój, używając tylko polecenia wklejania bez żadnych flag. – Ramesh

3

paste dwukrotnie sprawia, że ​​do mnie:

$ paste <(paste -d" " f1 f2) f3 
1 1 2 3 x x x 
2 4 5 yy yy 
     zz 
+0

Jak to działałoby w przypadku większej liczby plików lub różnych długości linii? –

+0

To powinno być przestudiowane, ale jest poza zakresem pytania. Fajnie, że pokryłeś to w swojej odpowiedzi, ale nie widzę potrzeby uogólniania wszystkich odpowiedzi: D – fedorqui