Как разделить строку в bash, разделенную по вкладке
Я пытаюсь разделить поле с разделителями табуляции в bash.
Мне известен этот ответ: как разбить строку в оболочке и получить последнее поле
Но это не отвечает за символ табуляции.
Я хочу сделать часть строки перед символом табуляции, поэтому я делаю это:
x=`head -1 my-file.txt`
echo ${x%\t*}
Но\t совпадает с буквой 't', а не на вкладке. Каков наилучший способ сделать это?
Спасибо
Ответы
Ответ 1
Если ваш файл выглядит примерно так (с вкладкой как разделитель):
1st-field 2nd-field
вы можете использовать cut
для извлечения первого поля (работает по вкладке по умолчанию):
$ cut -f1 input
1st-field
Если вы используете awk
, нет необходимости использовать tail
, чтобы получить последнюю строку, изменив ввод на:
1:1st-field 2nd-field
2:1st-field 2nd-field
3:1st-field 2nd-field
4:1st-field 2nd-field
5:1st-field 2nd-field
6:1st-field 2nd-field
7:1st-field 2nd-field
8:1st-field 2nd-field
9:1st-field 2nd-field
10:1st-field 2nd-field
Решение с использованием awk:
$ awk 'END {print $1}' input
10:1st-field
Чистый bash -решение:
#!/bin/bash
while read a b;do last=$a; done < input
echo $last
выходы:
$ ./tab.sh
10:1st-field
Наконец, решение с использованием sed
$ sed '$s/\(^[^\t]*\).*$/\1/' input
10:1st-field
здесь, $
- оператор диапазона; т.е. работать только с последней строкой.
В качестве исходного вопроса используйте литеральную вкладку, т.е.
x="1st-field 2nd-field"
echo ${x% *}
выходы:
1st-field
Ответ 2
Используйте $'ANSI-C'
строки в расширении параметра:
$ x=$'abc\tdef\tghi'
$ echo "$s"
abc def ghi
$ echo ">>${x%%$'\t'*}<<"
>>abc<<
Ответ 3
Использовать awk.
echo $yourfield | awk '{print $1}'
или, в вашем случае, для первого поля из последней строки файла
tail yourfile | awk '{x=$1}END{print x}'
Ответ 4
read field1 field2 <<< ${tabDelimitedField}
или
read field1 field2 <<< $(command_producing_tab_delimited_output)
Ответ 5
x=first$'\t'second
echo "${x%$'\t'*}"
См. QUOTING в man bash
Ответ 6
Для строки, разделенной табуляцией, есть простой способ: преобразовать ее в массив.
Создайте строку с табуляцией ($ добавлен ранее для интерпретации '\ t'):
AAA=$'ABC\tDEF\tGHI'
Разбить строку как массив, используя круглые скобки:
BBB=($AAA)
Получить доступ к любому элементу:
echo ${BBB[0]}
ABC
echo ${BBB[1]}
DEF
echo ${BBB[2]}
GHI