Assumindo que esses são {tab}
caracteres no espaçamento ...
Você nunca verá uma guia em awk
ou tr
porque ela já foi usada como o caractere separador de campo por cut
.
Parece que você está tentando substituir um campo vazio por x
. Se este for o caso, você pode usar construções como esta:
#!/bin/bash
#
while IFS= read -r line
do
first=$(echo "$line" | awk -F$'\t' '{print $1}')
middle=$(echo "$line" | awk -F$'\t' '{print $2}')
last=$(echo "$line" | awk -F$'\t' '{print $3}')
id=$(echo "$line" | awk -F$'\t' '{print $4}')
dept=$(echo "$line" | awk -F$'\t' '{print $5}')
echo "First is ${first:-x}"
echo "Middle is ${middle:-x}"
echo "Last is ${last:-x}"
echo "Id is ${id:-x}"
echo "Dept is ${dept:-x}"
echo
done
Não podemos dividir com IFS=$'\t' read -r first middle last...
porque read
divide em execuções de espaços em branco (espaço, tabulação, nova linha) em vez de instâncias únicas. (Na verdade, é mais complicado do que isso; procure "Word Splitting" na página de manual para os detalhes completos).
Eu evitei usar echo "$line" | cut -f1
, etc., porque se cut
ficar sem campos, ele reutilizará o último que encontrar.
Como uma alternativa para "$ {middle: -x}" você pode realmente atribuir x
para a variável se ela não estiver definida com a construção ${middle:=x}
. Prefixo que com o comando no-op :
se você quiser que a atribuição aconteça sozinha (e não como um efeito colateral de algum outro comando):
: ${middle:=x}
echo "The middle is $middle" # Will be 'x' if it was unset