2016-11-05 64 views
10

plików letters.csv zawiera:Dołącz do tej samej linii w bash

b,a,c, 

Plik numbers.csv zawiera:

32 
34 
25 
13 

chciałbym dołączyć do letters.csv jak numbers.csv to:

b,a,c,32,34,25,13 

próbowałem to:

sed -e :a -e '{N; s/\n/,/g; ta}' numbers.csv >> letters.csv 

to jednak stawia dołączone wpisy na nowej linii:

b,a,c, 
32,34,25,13 

Chciałbym wszystkie wpisy dotyczące tej samej linii. Jak to zrobić?

+0

Przekierowanie wyjścia append ('' >>) dołącza do gdziekolwiek koniec pliku jest. Jeśli jest tam znak nowej linii, dołączane dane przychodzą później. Jeśli nie ma ciągłego znaku nowej linii, dodane bajty pojawiają się w tej samej linii. – KingRadical

+0

Gdybym był tobą, dołączałbym kilka liter również do linii numerów. –

Odpowiedz

7

Możesz to zrobić samodzielnie pod numerem paste.

Najpierw konwertuj zawartość w numbers.csv na wartości rozdzielane przecinkami. -s jest opcja szeregowego i -d, określa przecinka jako separatora:

$ paste -sd, numbers.csv 
32,34,25,13 

następnie dołączyć to wyjście do letters.csv określając pusty separator i process substitution:

$ # use -d'\0' for non-GNU version of paste 
$ paste -d '' letters.csv <(paste -sd, numbers.csv) > tmp && mv tmp letters.csv 
$ cat letters.csv 
b,a,c,32,34,25,13 


Aby zmodyfikować polecenie sed pisał w OP, użyj command substitution:

$ sed -i -e "s/$/$(sed -e :a -e '{N; s/\n/,/g; ta}' numbers.csv)/" letters.csv 
$ cat letters.csv 
b,a,c,32,34,25,13 
5

Można użyć tr:

cat letters.csv numbers.csv | tr '\n' ',' | sed 's/,$/\n/' 

(mam nadzieję, że to nie jest bezużyteczny wykorzystanie cat. :-))

Na końcu potrzebny jest sed, aby zastąpić ostatni znakznakiem nowej linii.

+2

dobry, można dodać '| sed 's /, $/\ n /' 'do usuwania końcowych', 'i dodawania nowych linii zamiast :) – Sundeep

+1

będzie to prawdopodobnie najlepsze rozwiązanie, jeśli uwzględnimy sugestię @ Sundeep. – karakfa

3

awk na ratunek!

$ awk 'NR==FNR{printf "%s",$0; next} 
       {print $0} 
      END{ORS="\n"; print ""}' letters ORS=, numbers | 
    sed '$s/,$//' # to delete last "," 

b,a,c,32,34,25,13 
1
awk 'FNR==NR{t=$0;next}{s=s","$0}END{print t s}' letters.csv numbers.csv 
+0

jest to dobry zamiennik z awk, jednak nie obsługuje on ciągłego ',' w liter.csv .. który jest łatwy do naprawienia za pomocą 'awk 'FNR == NR {t = 0; następny} {s = FNR == 1? 0: s "," 0 "} END {print ts}" letters.csv numbers.csv " – Sundeep