Portál AbcLinuxu, 12. května 2025 18:26
Řešení dotazu:
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
cut -b 1-5 souborNevyhovuje - ořízne konce řádků, ale my chceme oříznout slova oddělená na řádku čárkami.
#!/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; #eofZdrojový text je v souboru a:
# cat a ovoce,zelenina,mandarinky,jablka okurky,kapusta,cibule,chmel jahody,maliny,papriky,kokosy brambory,mirabelkySpuštění čte z a zapisuje do b:
# ./filter.sh < a > bVýsledný text je v souboru b:
# cat b ovoce,zelen,manda,jablk okurk,kapus,cibul,chmel jahod,malin,papri,kokos bramb,mirab
awk -F, 'BEGIN {OFS = ","} { for (i = 1; i <= NF; i++) { $i = substr($i, 1, 5) } print }' <data.txt
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
Dobře, tohle je hezčí řešení než to mojeJestli 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
IFS=',' while read -a aline; do line="`printf '%.4s,' ${aline[@]}`" printf '%s\n' "${line:0:-1}" done
#!/bin/bash while IFS=',' read -a aline; do line="`printf '%.5s,' ${aline[@]}`" printf '%s\n' "${line:0:-1}" done
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;
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.