Как разделить строку в bash, разделенную табуляцией - PullRequest
28 голосов
/ 11 июля 2011

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

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

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

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

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

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

Спасибо

Ответы [ 6 ]

53 голосов
/ 11 июля 2011

Если ваш файл выглядит примерно так (с вкладкой в ​​качестве разделителя):

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
13 голосов
/ 12 июля 2011

Используйте $'ANSI-C' строки в расширении параметра:

$ x=$'abc\tdef\tghi'
$ echo "$s"
abc     def     ghi
$ echo ">>${x%%$'\t'*}<<"
>>abc<<
6 голосов
/ 11 июля 2011

Используйте awk.

echo $yourfield | awk '{print $1}'

или, в вашем случае, для первого поля из последней строки файла

tail yourfile | awk '{x=$1}END{print x}'
3 голосов
/ 19 декабря 2017
read field1 field2 <<< ${tabDelimitedField}

или

read field1 field2 <<< $(command_producing_tab_delimited_output)
0 голосов
/ 24 мая 2019

Для строки, разделенной табуляцией, есть простой способ: преобразовать ее в массив.

Создать строку с табуляцией ($ добавлен ранее для интерпретации '\ t'):

AAA=$'ABC\tDEF\tGHI'

Разбить строку как массив, используя круглые скобки:

BBB=($AAA) 

Получить доступ к любому элементу:

echo ${BBB[0]}
ABC
echo ${BBB[1]}
DEF
echo ${BBB[2]}
GHI
0 голосов
/ 23 августа 2016

x=first$'\t'second
echo "${x%$'\t'*}"

См. Цитата в man bash

...