Antworten:
Im Folgenden finden Sie etwa ein Dutzend Beispiele dafür, wie Sie eine Datei wie diese erstellen können:
$ cat k.txt
1
2
3
und konvertieren Sie es in dieses Format:
1,2,3
Mit diesem Befehl können Sie die obige Datei erstellen, wenn Sie mitspielen möchten:
$ cat <<EOF > k.txt
1
2
3
EOF
Die folgenden Beispiele sind in zwei Gruppen unterteilt. Diejenigen, die "arbeiten" und diejenigen, die "fast" funktionieren. Ich lasse diese, weil es oft genauso wertvoll ist zu sehen, warum etwas nicht funktioniert, wie zu sehen, warum etwas funktioniert.
Die meisten mir bekannten Skriptsprachen sind vertreten. Einige sind mehrfach vertreten, da wie bei dem berühmten Akronym, auf das in Perl typischerweise Bezug genommen wird, TIMTOWTDI .
HINWEIS: Sie können das Komma ( ,
) in den folgenden Beispielen austauschen und durch beliebige Zeichen ersetzen, z |
.
Diese Codefragmente erzeugen die gewünschte Ausgabe.
Der paste
Befehl:
$ paste -s -d ',' k.txt
1,2,3
Der sed
Befehl:
$ sed ':a;N;$!ba;s/\n/,/g' k.txt
1,2,3
$ sed ':a;{N;s/\n/,/};ba' k.txt
1,2,3
Der perl
Befehl:
$ perl -00 -p -e 's/\n(?!$)/,/g' k.txt
1,2,3
$ perl -00 -p -e 'chomp;tr/\n/,/' k.txt
1,2,3
Der awk
Befehl:
$ 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
Der python
Befehl:
$ 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
Bash ist mapfile
eingebaut:
$ mapfile -t a < k.txt; (IFS=','; echo "${a[*]}")
1,2,3
Der ruby
Befehl:
$ ruby -00 -pe 'gsub /\n/,",";chop' < k.txt
1,2,3
$ ruby -00 -pe '$_.chomp!"\n";$_.tr!"\n",","' k.txt
1,2,3
Der php
Befehl:
$ php -r 'echo strtr(chop(file_get_contents($argv[1])),"\n",",");' k.txt
1,2,3
Vorsichtsmaßnahmen
Die meisten der obigen Beispiele funktionieren einwandfrei. Einige haben versteckte Probleme, wie das obige PHP-Beispiel. Die Funktion chop()
ist eigentlich ein Alias für rtrim()
, sodass auch die nachgestellten Leerzeichen der letzten Zeile entfernt werden.
Dies gilt auch für das erste Ruby-Beispiel und das erste Python-Beispiel. Das Problem ist, wie sie alle eine Art von Operation verwenden, die im Wesentlichen blind einen nachgestellten Charakter "abschneidet". Dies ist in Ordnung für das Beispiel, das das OP bereitgestellt hat, aber bei der Verwendung dieser Typen von Einzeilern muss vorsichtig vorgegangen werden, um sicherzustellen, dass sie mit den Daten übereinstimmen, die sie verarbeiten.
Beispiel
Sagen Sie unsere Beispieldatei, k.txt
sah stattdessen so aus:
$ echo -en "1\n2\n3" > k.txt
Es sieht ähnlich aus, hat aber einen kleinen Unterschied. Es hat keine abschließende Newline ( \n
) wie die Originaldatei. Wenn wir nun das erste Python-Beispiel ausführen, erhalten wir Folgendes:
$ python -c "import sys; print sys.stdin.read().replace('\n', ',')[0:-1]" <k.txt
1,2,
Dies sind die Beispiele "immer eine Brautjungfer, nie eine Braut" . Die meisten von ihnen könnten wahrscheinlich angepasst werden, aber wenn man an einer möglichen Lösung für ein Problem arbeitet und sich "gezwungen" fühlt, ist es wahrscheinlich das falsche Werkzeug für den Job!
Der perl
Befehl:
$ perl -p -e 's/\n/,/' k.txt
1,2,3,
Der tr
Befehl:
$ tr '\n' ',' < k.txt
1,2,3,
Die cat
+ echo
Befehle:
$ echo $(cat k.txt)
1 2 3
Der ruby
Befehl:
$ ruby -pe '$_["\n"]=","' k.txt
1,2,3,
Bash's while
+ read
eingebaute:
$ while read line; do echo -n "$line,"; done < k.txt
1,2,3,
awk
ich bevorzuge eine kürzere Alternative:awk -vORS=, 1 k.txt
bash
:mapfile -t a < k.txt; (IFS=','; echo "${a[*]}")
perl
und zuerst awk
sie auch.
paste
den oben platzieren. Genau dafür paste -s
ist es hier. Es ist ein Standardbefehl und wäre der effizienteste. Alle anderen sind übertrieben und / oder nicht tragbar oder haben Einschränkungen.
mapfile
ist relativ neu, hinzugefügt in bash
4.0.
@slm hat schon eine nette Antwort gegeben, aber als deine Frage "Formatausgabe von xargs"
xargs -I{} echo -n "{}|" < test.txt
-I
ist die Option "Zeichenfolgen ersetzen".{}
ist ein Platzhalter für den Ausgabetext.Wenn Sie das Nachlaufen loswerden möchten, |
können sed
Sie einige Aufräumarbeiten durchführen:
$ xargs -I{} echo -n "{}|" < k.txt | sed -e 's/|$//'
1|2|3
tr
, sed
und andere auch ..
Das ist ein alter Thread, ich weiß. Das OP fragte mit einem einfachen Code wie diesem. Um es nahe am Original zu halten, habe ich eine einfache Lösung.
cat k.txt | xargs
1 2 3
benutze sed
cat k.txt | xargs | sed 's/ /,/g'
1,2,3
oder
cat k.txt | xargs | sed 's/ /|/g'
1|2|3
sed kann etwas seltsam aussehen, ist aber kaputt, es macht viel Sinn.
ist für Ersatz. g 'ist für global: ohne dies wird nur die erste Ersetzung in jeder neuen Zeile durchgeführt. Da Sie 'xargs' verwenden, werden diese als eine Zeile angezeigt. Sie erhalten also "1,2 3".
Das Trennzeichen wird zur Trennung verwendet. Ich habe das Zeichen / verwendet. Ein interessanter Trick: Sie können das Trennzeichen durch fast jedes andere Zeichen ersetzen, solange wir zwischen den Anführungszeichen das gleiche Format beibehalten. Das würde also auch funktionieren ....
cat k.txt | xargs | sed 's# #,#g'
oder
cat k.txt | xargs | sed 'sT T,Tg'
Die Verwendung bestimmter Zeichen als Trennzeichen kann natürlich verwirrend sein. Seien Sie also schlau.
xargs <k.txt | tr \ \|
Sie brauchen nicht cat
- übergeben Sie einfach die Dateieingabe und - wenn kein anderer Befehl gegeben wird - xargs
geben Sie das Standardformat aus - das von einer Art mit /bin/echo
's ist (ohne Backslash-C-Escape-Interpretationen) .
xargs
entfernt Kopf- / Schwanz-Leerzeichen aus der Eingabedatei und drückt andere Leerzeichenfolgen auf ein einzelnes Leerzeichen. Dies bedeutet, dass beim Übergeben der Datei von tr
zu xargs
mögen:
tr \\n \| <k.txt | xargs
... druckt ...
1|2|3|
... in die andere Richtung gehen und nur mit den Argumenten arbeiten , die durch xargs
Leerzeichen begrenzt werden ....
1|2|3\n
... weil xargs
die letzte nachfolgende neue Zeile gedruckt wird (wie für eine Textdatei erforderlich) , diese aber nicht auf tr
diese Weise übersetzt wird.
Beachten Sie jedoch, dass diese (oder jede andere hier angebotene Lösung) das xargs
Zitieren in der Eingabe nicht berücksichtigt . xargs
wird buchstäblich Single / Double / Backslash-zitierte Nicht-Newline-Whitespace-Zeichen in der Eingabe ausgeben, die selbst wie folgt zitiert werden können:
xargs <<\IN
1 2' 3'\' \'4
IN
1 2 3' '4
xargs cat -n
, aber es ist einfacher , wenn Sie nur die Zeilenumbrüche trimmen, kann dies erreicht werden durchecho $(cat)
,grep
oderawk
(Crawl die Art und Weise , es zu tun).xargs
passen nicht gut für Ihren aktuellen Zweck.