Предположим, что это {tab}
символов в интервале ...
Вы никогда не увидите табуляцию в ваших awk
или tr
, потому что он уже использовался в качестве символа разделителя полей cut
.
Похоже, вы пытаетесь заменить пустое поле на x
. В этом случае вы можете использовать такие конструкции:
#!/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
Мы не можем разделить с помощью IFS = $ '\ t' read -r first middle last ...
потому что читает
] разбивается на пробелы (пробел, табуляция, новая строка), а не на отдельные экземпляры. (На самом деле это намного сложнее; полные сведения можно найти в разделе «Разделение слов» на странице руководства.)
Я не стал использовать echo "$ line" | cut -f1
и т. д., потому что, если cut
исчерпывает поля, он повторно использует последнее найденное.
В качестве альтернативы "$ {middle: -x}" вы можете присвоить переменной x
, если она не установлена конструкцией $ {middle: = x}
. Префикс с помощью команды no-op :
, если вы хотите, чтобы назначение происходило само по себе (а не как побочный эффект какой-либо другой команды):
: ${middle:=x}
echo "The middle is $middle" # Will be 'x' if it was unset
Ваш скрипт DOS
закодирован и sh
/ bash
это не нравится. Установите dos2unix
и запустите
dos2unix <script>
в вашем скрипте. И снова запустить.