Odpowiedzi:
Poniżej znajduje się kilkanaście przykładów, w jaki sposób możesz pobrać taki plik:
$ cat k.txt
1
2
3
i przekonwertuj go na ten format:
1,2,3
Możesz użyć tego polecenia, aby utworzyć powyższy plik, jeśli chcesz grać razem:
$ cat <<EOF > k.txt
1
2
3
EOF
Poniższe przykłady są podzielone na 2 grupy. Te, które „pracują” i te, które „prawie” działają. Opuszczam je, ponieważ często jest tak samo cenne, aby zobaczyć, dlaczego coś nie działa, jak i zobaczyć, dlaczego coś działa.
Większość znanych mi języków skryptowych jest reprezentowanych. Niektóre są reprezentowane wiele razy, ponieważ podobnie jak w przypadku słynnego akronimu, do którego zwykle odwołuje się Perl, TIMTOWTDI .
UWAGA: Możesz zamienić przecinek ( ,
) w poniższych przykładach i zastąpić go dowolnymi znakami, np |
.
Te fragmenty kodu wygenerują pożądany wynik.
paste
Polecenie:
$ paste -s -d ',' k.txt
1,2,3
sed
Polecenie:
$ sed ':a;N;$!ba;s/\n/,/g' k.txt
1,2,3
$ sed ':a;{N;s/\n/,/};ba' k.txt
1,2,3
perl
Polecenie:
$ perl -00 -p -e 's/\n(?!$)/,/g' k.txt
1,2,3
$ perl -00 -p -e 'chomp;tr/\n/,/' k.txt
1,2,3
awk
Polecenie:
$ awk '{printf"%s%s",c,$0;c=","}' k.txt
1,2,3
$ awk '{printf "%s,",$0}' k.txt | awk '{sub(/\,$/,"");print}'
1,2,3
$ awk -vORS=, 1 k.txt | awk '{sub(/\,$/,"");print}'
1,2,3
$ awk 'BEGIN {RS="dn"}{gsub("\n",",");print $0}' k.txt | awk '{sub(/\,$/,"");print}'
1,2,3
python
Polecenie:
$ python -c "import sys; print sys.stdin.read().replace('\n', ',')[0:-1]" <k.txt
1,2,3
$ python -c "import sys; print sys.stdin.read().replace('\n', ',').rstrip(',')" <k.txt
1,2,3
mapfile
Wbudowane Bash :
$ mapfile -t a < k.txt; (IFS=','; echo "${a[*]}")
1,2,3
ruby
Polecenie:
$ ruby -00 -pe 'gsub /\n/,",";chop' < k.txt
1,2,3
$ ruby -00 -pe '$_.chomp!"\n";$_.tr!"\n",","' k.txt
1,2,3
php
Polecenie:
$ php -r 'echo strtr(chop(file_get_contents($argv[1])),"\n",",");' k.txt
1,2,3
Ostrzeżenia
Większość powyższych przykładów będzie działać dobrze. Niektóre mają ukryte problemy, takie jak powyższy przykład PHP. Funkcja chop()
jest właściwie aliasem do rtrim()
, więc końcowe spacje ostatniego wiersza również zostaną usunięte.
Podobnie jest z pierwszym przykładem Rubiego i pierwszym przykładem Pythona. Problem polega na tym, że wszyscy wykorzystują rodzaj operacji, która zasadniczo „odcina”, ślepo, końcową postać. Jest to dobre na przykład w przypadku dostarczonego przez PO, ale należy zachować ostrożność podczas korzystania z tych typów jednego wkładki, aby upewnić się, że są one zgodne z przetwarzanymi danymi.
Przykład
Powiedz nasz przykładowy plik, k.txt
wyglądał tak:
$ echo -en "1\n2\n3" > k.txt
Wygląda podobnie, ale ma jedną niewielką różnicę. Nie ma końcowego znaku nowej linii ( \n
) jak oryginalny plik. Teraz, gdy uruchamiamy pierwszy przykład w języku Python, otrzymujemy:
$ python -c "import sys; print sys.stdin.read().replace('\n', ',')[0:-1]" <k.txt
1,2,
Oto przykłady „zawsze druhny, nigdy nie panny młodej” . Większość z nich prawdopodobnie można by zaadaptować, ale gdy pracuje się nad potencjalnym rozwiązaniem problemu, kiedy wydaje się on „zmuszony”, jest to prawdopodobnie nieodpowiednie narzędzie do pracy!
perl
Polecenie:
$ perl -p -e 's/\n/,/' k.txt
1,2,3,
tr
Polecenie:
$ tr '\n' ',' < k.txt
1,2,3,
W cat
+ echo
komendy:
$ echo $(cat k.txt)
1 2 3
ruby
Polecenie:
$ ruby -pe '$_["\n"]=","' k.txt
1,2,3,
Wbudowane Bash while
+ read
:
$ while read line; do echo -n "$line,"; done < k.txt
1,2,3,
awk
wolę krótszą alternatywę:awk -vORS=, 1 k.txt
bash
:mapfile -t a < k.txt; (IFS=','; echo "${a[*]}")
perl
i pierwszy awk
też je mają.
paste
na górze. Właśnie po to paste -s
tu jest. To standardowe polecenie i byłoby najbardziej wydajne. Wszystkie pozostałe mają nadmiar umiejętności i / lub nie są przenośne lub mają ograniczenia.
mapfile
jest stosunkowo nowy, dodany w wersji bash
4.0.
@slm już miło odpowiedział, ale jako pytanie „sformatuj wyjście xargs”
xargs -I{} echo -n "{}|" < test.txt
-I
jest opcja „zamień ciągi”.{}
jest symbolem zastępczym dla tekstu wyjściowego.Jeśli chcesz pozbyć się trailingu |
, możesz sed
zrobić porządki:
$ xargs -I{} echo -n "{}|" < k.txt | sed -e 's/|$//'
1|2|3
tr
, sed
a także inne ...
To jest stary wątek, wiem. OP poprosił o taki prosty kod. Aby utrzymać go blisko oryginału, mam proste rozwiązanie.
cat k.txt | xargs
1 2 3
użyj sed
cat k.txt | xargs | sed 's/ /,/g'
1,2,3
lub
cat k.txt | xargs | sed 's/ /|/g'
1|2|3
sed może wyglądać trochę dziwnie, ale zepsuty, ma to sens.
zastępuje. g 'jest globalne: bez tego spowoduje tylko pierwsze podstawienie w każdej nowej linii. Ponieważ używasz „xargs”, wyświetla je jako jeden wiersz. Otrzymasz więc „1,2 3”.
Separator służy do separacji. Użyłem znaku /. Jedna interesująca sztuczka: możesz zastąpić separator większością dowolnych innych znaków, o ile zachowamy ten sam format między cudzysłowami. To zadziałałoby również ....
cat k.txt | xargs | sed 's# #,#g'
lub
cat k.txt | xargs | sed 'sT T,Tg'
Oczywiście używanie pewnych znaków jako separatora może być mylące, więc bądź mądry.
xargs <k.txt | tr \ \|
Nie trzeba cat
- wystarczy przejść na wejściu plików i - jeśli nie podano innego polecenia - xargs
przejdzie na jego domyślnego formatu - który jest w rodzaju z /bin/echo
„s (bez interpretacji backslash c-escape) .
xargs
usunie białe znaki z głowy / ogona z pliku wejściowego i wyciśnie inne sekwencje białych znaków do pojedynczej spacji. Oznacza to, że podczas przechodzenia z pliku tr
do xargs
takich jak:
tr \\n \| <k.txt | xargs
... drukuje ...
1|2|3|
... idzie w drugą stronę i działa tylko na argumentach, które xargs
ograniczają spacje ...
1|2|3\n
... ponieważ xargs
drukuje ostatni znak nowej linii (wymagany w przypadku pliku tekstowego) , ale nie uzyskuje w tr
ten sposób odpowiedzi.
Należy jednak pamiętać, że to (lub inne oferowane tutaj rozwiązanie) nie uwzględnia xargs
cytowania w danych wejściowych. xargs
poda dosłownie pojedyncze / podwójne / odwrócone ukośniki znaki spacji w nowej linii, które same mogą być cytowane w następujący sposób:
xargs <<\IN
1 2' 3'\' \'4
IN
1 2 3' '4
xargs cat -n
, ale jest łatwiejsze, jeśli tylko przyciąć znaki nowej linii, to można osiągnąćecho $(cat)
,grep
lubawk
(kraul drodze to zrobić).xargs
nie pasują dobrze do twojego obecnego celu.