Eu tenho um arquivo de texto contendo um nome de arquivo em cada linha:
111_c4l5r120.png
123_c4l4r60.png
135_c4l4r180.png
147_c4l3r60.png
15_c4l1r120.png
...
Eu quero convertê-lo nesta forma:
111_c4l5r120.png 111
123_c4l4r60.png 123
135_c4l4r180.png 135
147_c4l3r60.png 147
15_c4l1r120.png 15
...
usando este código:
#!/bin/bash
while IFS='' read -r line || [[ -n "$line" ]]; do
echo "$line" >> output.txt
echo "$line" | cut -d'_' -f 1 >> output.txt
done < "$1"
mas, o resultado é:
111_c4l5r120.png
111
123_c4l4r60.png
123
135_c4l4r180.png
135
147_c4l3r60.png
147
15_c4l1r120.png
15
...
Como devo mudar meu script para obter o resultado desejado?
shell
shell-script
Todos
fonte
fonte
Respostas:
A menos que você tenha uma necessidade específica de usar o shell para isso, a resposta de terdon fornece melhores alternativas.
Como você está usando
bash
(como indicado no shebang do script), você pode usar a-n
opção para ecoar:Ou você pode usar os recursos de shell para processar a linha sem usar
cut
:(substituindo as duas
echo
linhas).Como alternativa,
printf
isso também funcionaria, funciona em qualquer shell POSIX e geralmente é melhor (consulte Por que o printf é melhor que o eco? Para obter detalhes):ou
(Estritamente falando, na planície
/bin/sh
,echo -n
não é portátil . Desde que você está usando explicitamentebash
que está tudo bem aqui.)fonte
Não faça esse tipo de coisa no shell! É muito mais complexo do que o necessário, propenso a erros e muito, muito, mais lento. Existem muitas ferramentas projetadas para essa manipulação de texto. Por exemplo, em
sed
(assumindo aqui implementações recentes de GNU ou BSD para-E
):Ou, para qualquer
sed
:Perl:
awk:
fonte
sed
umsed 's/\([^_]*\).*/& \1/' file
para portabilidade extra. O ponto é que você pode contarawk
esed
estar lá mais do que pode contar com praticamente qualquer outra coisa.Olha Você aqui:
Resultado:
fonte