/ / Unix - linia podziału po 9 przecinku - unix, shell, awk, ksh

Unix - Podziel linię po 9 przecinku - unix, shell, awk, ksh

Piszę skrypt powłoki ksh i mam długi czasciąg oddzielony przecinkami, który muszę podzielić na osobne linie dopiero po 9 przecinku. Po 9 przecinku chcę usunąć ten przecinek i utworzyć nową linię:

Na przykład: Początkowy ciąg 1,2,3,4,5,6,7,8,9,10,11,12,13,14,14,15,16,17,18,19,20,21

Wydajność:

1,2,3,4,5,6,7,8,9,10
11,12,13,14,14,15,16,17,18,19,20
21

Wiem, że jest to możliwe dzięki awk, ale nie znam się tak dobrze na dowodzeniu. Czy ktoś może podać, jak to zrobić

Dzięki

Odpowiedzi:

2 dla odpowiedzi № 1
$ s="1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21"

$ print "$s" | tr , "n" | paste -d , - - - - - - - - - - | sed -e "s/,+$//"
1,2,3,4,5,6,7,8,9,10
11,12,13,14,15,16,17,18,19,20
21

$ print "$s" | tr , "n" | xargs -n 10 echo | tr " " ,
1,2,3,4,5,6,7,8,9,10
11,12,13,14,15,16,17,18,19,20
21

3 dla odpowiedzi № 2
cat t.txt | xargs -d, -rn10 | sed "s/ /,/g"

Uwaga: bezużyteczne użycie cat dla jasności: może to być dowolny proces

W zależności od faktycznej potrzeby upuść sed krok i ogranicz przestrzeń wyjściową

Punkty bonusowe:

Wejście (t.txt)

1,2,3,4,5,6,7,8,9,10,11,12,13,14,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

Wydajność

1,2,3,4,5,6,7,8,9,10
11,12,13,14,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

Jeśli chcesz uzyskać jednolite wypełnienie linii, dodaj wklej:

paste -sd, t.txt| xargs -d, -n10 | sed "s/ /,/g"

1,2,3,4,5,6,7,8,9,10
11,12,13,14,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

3 dla odpowiedzi nr 3
awk -F, "{
for (i=1; i<=NF; i++) {
printf("%s", $i);
if (i % 10 == 0 || i == NF)
printf "n";
else
printf ",";
}
}" textfile

Wyjaśnienie: NF to liczba pól. $i jest i"pole; $ jest operatorem w Awk, a nie pieczęć.