Давайте немного исправим это.
for i in `cat test.file | cut -d. -f1 | sed 's/[0-9]//g' | uniq`
Не делайте этого.Не используйте подоболочку для предоставления списка в for
, не используйте cat
для подачи программ, которые могут читать файл напрямую, не используйте длинный конвейер, когда подпроцессы не нужны ...
name=$(cat test.file | grep ^$i[0-9] | head -1)
Если вы используете bash
, нет необходимости запускать три (технически четыре?) Подпроцесса на каждой итерации, чтобы получить эту отредактированную строку.cf эта страница .
#!/bin/bash
last=''
while read name
do label="${name%%[.0-9]*}"
if [[ "$label" != "$last" ]]
then echo "[$label]" # or printf "\n$label\n" for a separator line
last="$label"
fi
echo "$name"
done < test.file > file.redux
Вывод:
[abc]
abc01.hostname.com
[xyzabc]
xyzabc01.hostname.com
xyzabc02.hostname.com
Тогда, если вы удовлетворены результатами,
mv file.redux test.file
Все обработанов bash быстро и эффективно, без порождения до тех пор, пока результат не будет хорошим.
Если вы думаете, что это будет МНОГО данных, попробуйте awk
с той же логикой.:)