Подтвердить что ты не робот

Как разделить строку в bash, разделенную по вкладке

Я пытаюсь разделить поле с разделителями табуляции в bash.

Мне известен этот ответ: как разбить строку в оболочке и получить последнее поле

Но это не отвечает за символ табуляции.

Я хочу сделать часть строки перед символом табуляции, поэтому я делаю это:

x=`head -1 my-file.txt`
echo ${x%\t*}

Но\t совпадает с буквой 't', а не на вкладке. Каков наилучший способ сделать это?

Спасибо

4b9b3361

Ответ 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