5 Stimmen

Newline in Komma umwandeln

Ich habe eine Textdatei mit einer Liste von etwa 150 bis 200 Dateinamen

abc.txt
pqr.txt
xyz.txt
...
...

Ich benötige eine Reihe von kommagetrennten Dateien. Jeder String sollte nicht mehr als 20 Dateien enthalten. Das Echo wird also etwa so aussehen...

$string1="abc.txt,pqr.txt,xyz.txt..."
$string2="abc1.txt,pqr1.txt,xyz1.txt..."
...

Die Anzahl der Zeichenfolgen hängt von der Anzahl der Zeilen in der Datei ab. Ich habe etwas Ähnliches geschrieben...

#!/bin/sh
delim=','
for gsfile in `cat filelist.txt`
do
filelist=$filelist$delim$gsfile
echo $filelist
done

Der Befehl "Übersetzen" funktioniert wie erwartet, aber wie kann ich jede Zeichenfolge auf 20 Dateinamen beschränken?

cat filelist.txt | tr '\n' ','

6voto

Igor Chubin Punkte 59929

Verwenden Sie einfach xargs :

$ seq 1 50 | xargs -n20 | tr ' ' ,
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40
41,42,43,44,45,46,47,48,49,50

0voto

potong Punkte 51035

Das könnte für Sie funktionieren:

seq 41 | paste -sd ',,,,,,,,,,,,,,,,,,,\n' 
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40
41

oder GNU sed:

seq 41 | sed ':a;$bb;N;s/\n/&/19;Ta;:b;y/\n/,/'
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40
41

0voto

Birei Punkte 34938

Ein Weg über sed :

Hinzufügen wie Igor Tschubin 50 Nummern bis infile :

seq 1 50 >infile

Inhalt der script.sed :

:b
## While not last line...
$! {
    ## Check if line has 19 newlines. Try substituting the line with itself and
    ## check if it succeed, then append next line and do it again in a loop.
    s/\(\n[^n]*\)\{19\}/&/
    ta  
    N   
    bb  
}

## There are 20 lines in the buffer or found end of file, so substitute all '\n' 
## with commas and print.
:a
s/\n/,/g
p

Führen Sie es so aus:

sed -nf script.sed infile

Mit folgender Ausgabe:

1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40
41,42,43,44,45,46,47,48,49,50

0voto

William Pursell Punkte 188248

Verwenden Sie ein Flag in sed's s um jedes 20. Komma durch einen Zeilenumbruch zu ersetzen:

 < filelist.txt tr '\n' , | sed ':a; s/,/\n/20; P; D; ta'; echo

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X