Portál AbcLinuxu, 12. května 2025 18:26

Dotaz: bash: Jak upravit soubor

8.9.2017 16:15 michal
bash: Jak upravit soubor
Přečteno: 515×
Odpovědět | Admin
Jak zkrátit všechny řetězce v celém souboru na pět znaků ? Jde o to uřezat konec každého řetězce. Řetězce jsou bez mezer a jsou oddělené čárkami.

Příklad - obsah původního souboru:

ovoce,zelenina,mandarinky,jablka
okurky,kapusta,cibule,chmel
jahody,maliny,papriky,kokosy
brambory,mirabelky

Požadovaný obsah:

ovoce,zelen,manda,jablk
okurk,kapus,cibul,chmel
jahod,malin,papri,kokos
bramb,mirab

Řešení dotazu:


Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

8.9.2017 16:27 Vlad
Rozbalit Rozbalit vše Re: bash: Jak upravit soubor
Odpovědět | | Sbalit | Link | Blokovat | Admin
perl -pe 's/([^,\n]+)/substr $1, 0, 5/ge' < input > output

nebo přímo upravit v souboru

perl -pi -e 's/([^,\n]+)/substr $1, 0, 5/ge' text
8.9.2017 23:50 michal
Rozbalit Rozbalit vše Re: bash: Jak upravit soubor
To je zajímavé, jak se v tom Perlu dají některé věci jednoduše řešit. Ale v tuto chvíli to funguje všechno, kromě odpovědi od Jirka. Díky všem.
8.9.2017 16:35 Jirka
Rozbalit Rozbalit vše Re: bash: Jak upravit soubor
Odpovědět | | Sbalit | Link | Blokovat | Admin
cut -b 1-5 soubor
8.9.2017 20:11 OldFrog {Ondra Nemecek} | skóre: 36 | blog: Žabákův notes | Praha
Rozbalit Rozbalit vše Re: bash: Jak upravit soubor
cut -b 1-5 soubor
Nevyhovuje - ořízne konce řádků, ale my chceme oříznout slova oddělená na řádku čárkami.
-- OldFrog
8.9.2017 20:09 OldFrog {Ondra Nemecek} | skóre: 36 | blog: Žabákův notes | Praha
Rozbalit Rozbalit vše Re: bash: Jak upravit soubor
Odpovědět | | Sbalit | Link | Blokovat | Admin
Skript pro filtrování standardního vstupu na výstup - uložit do souboru filter.sh a nastavit spustitelnost:
#!/bin/bash

while read LINE;
do
	FIRST="Y";
	echo "${LINE}" | sed 's!,!\n!g' | \
	while read WORD;
	do
		if [ "${FIRST}" != "Y" ];
		then
			echo -ne ",";
		fi;
		echo -ne "${WORD}" | cut -z -c "1-5";
		FIRST="N";
	done;
	echo -ne "\n";
done;

#eof
Zdrojový text je v souboru a:
# cat a
ovoce,zelenina,mandarinky,jablka
okurky,kapusta,cibule,chmel
jahody,maliny,papriky,kokosy
brambory,mirabelky
Spuštění čte z a zapisuje do b:
# ./filter.sh < a > b
Výsledný text je v souboru b:
# cat b
ovoce,zelen,manda,jablk
okurk,kapus,cibul,chmel
jahod,malin,papri,kokos
bramb,mirab
-- OldFrog
8.9.2017 20:34 scisoft
Rozbalit Rozbalit vše Re: bash: Jak upravit soubor
Odpovědět | | Sbalit | Link | Blokovat | Admin
#!/bin/sh sed -E 's/([[:alpha:]]{1,5})[[:alpha:]]*([,$]*)/\1\2/g' zkus.txt

Soubor 'zkus.txt' obsahuje: ovoce,zelenina,mandarinky,jablka okurky,kapusta,cibule,chmel jahody,maliny,papriky,kokosy brambory,mirabelky

Vystup scriptu:

ovoce,zelen,manda,jablk okurk,kapus,cibul,chmel jahod,malin,papri,kokos bramb,mirab
10.9.2017 00:48 RM
Rozbalit Rozbalit vše Re: bash: Jak upravit soubor
sed -r 's/([^,]{,5})[^,]*/\1/g'
8.9.2017 20:57 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: bash: Jak upravit soubor
Odpovědět | | Sbalit | Link | Blokovat | Admin
awk -F, 'BEGIN {OFS = ","}
    {
        for (i = 1; i <= NF; i++) {
            $i = substr($i, 1, 5)
        }
        print
    }' <data.txt
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
8.9.2017 21:04 Andrej | skóre: 51 | blog: Republic of Mordor
Rozbalit Rozbalit vše Re: bash: Jak upravit soubor
Odpovědět | | Sbalit | Link | Blokovat | Admin

To je domácí úkol na awk (skoro) one-linery, že jo.

awk 'BEGIN {FS = ","; OFS = FS}
     {for (i = 1; i <= NF; ++i) $i = substr($i, 1, 5); print $0}'

Jestli to ale musí být opravdu striktně v čistém bashi, tak prosím:

IFS=','
while read -a line; do
  echo -n "${line[0]:0:5}"
  for word in "${line[@]:1}"; do
    echo -n ",${word:0:5}"
  done
  echo
done
8.9.2017 22:21 OldFrog {Ondra Nemecek} | skóre: 36 | blog: Žabákův notes | Praha
Rozbalit Rozbalit vše Re: bash: Jak upravit soubor

Jestli to ale musí být opravdu striktně v čistém bashi, tak prosím:

IFS=','
while read -a line; do
  echo -n "${line[0]:0:5}"
  for word in "${line[@]:1}"; do
    echo -n ",${word:0:5}"
  done
  echo
done
Dobře, tohle je hezčí řešení než to moje :-)
-- OldFrog
9.9.2017 23:40 RM
Rozbalit Rozbalit vše Re: bash: Jak upravit soubor
IFS=','
while read -a aline; do
  line="`printf '%.4s,' ${aline[@]}`"
  printf '%s\n' "${line:0:-1}"
done
9.9.2017 23:54 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: bash: Jak upravit soubor
Tohle vypadá hezky. Trochu jsem si to upravil:
#!/bin/bash

while IFS=',' read -a aline; do
  line="`printf '%.5s,' ${aline[@]}`"
  printf '%s\n' "${line:0:-1}"
done
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
8.9.2017 23:01 jekub
Rozbalit Rozbalit vše Re: bash: Jak upravit soubor
Odpovědět | | Sbalit | Link | Blokovat | Admin
IFS=,
function f5 {
   while :
   do
      echo -n "${1:0:5}"
      shift
      if [ -z $1 ]; then
         echo
         break
      fi
      echo -n "$IFS"
   done;
}

while read line;
do
   f5 $line
done;

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.