How to split a string in bash delimited by tab

橙三吉。 提交于 2019-11-28 23:51:55

问题


I'm trying to split a tab delimitted field in bash.

I am aware of this answer: how to split a string in shell and get the last field

But that does not answer for a tab character.

I want to do get the part of a string before the tab character, so I'm doing this:

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

But the \t is matching on the letter 't' and not on a tab. What is the best way to do this?

Thanks


回答1:


If your file look something like this (with tab as separator):

1st-field   2nd-field

you can use cut to extract the first field (operates on tab by default):

$ cut -f1 input
1st-field

If you're using awk, there is no need to use tail to get the last line, changing the input to:

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

Solution using awk:

$ awk 'END {print $1}' input
10:1st-field

Pure bash-solution:

#!/bin/bash

while read a b;do last=$a; done < input
echo $last

outputs:

$ ./tab.sh 
10:1st-field

Lastly, a solution using sed

$ sed '$s/\(^[^\t]*\).*$/\1/' input
10:1st-field

here, $ is the range operator; i.e. operate on the last line only.

For your original question, use a literal tab, i.e.

x="1st-field    2nd-field"
echo ${x%   *}

outputs:

1st-field



回答2:


Use $'ANSI-C' strings in the parameter expansion:

$ x=$'abc\tdef\tghi'
$ echo "$s"
abc     def     ghi
$ echo ">>${x%%$'\t'*}<<"
>>abc<<



回答3:


Use awk.

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

or, in your case, for the first field from the the last line of a file

tail yourfile | awk '{x=$1}END{print x}'



回答4:


read field1 field2 <<< ${tabDelimitedField}

or

read field1 field2 <<< $(command_producing_tab_delimited_output)



回答5:


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

See QUOTING in man bash




回答6:


There is an easy way for a tab separated string : convert it to an array.

Create a string with tabs ($ added before for '\t' interpretation) :

AAA=$'ABC\tDEF\tGHI'

Split the string as an array using parenthesis :

BBB=($AAA) 

Get access to any element :

echo ${BBB[0]}
ABC
echo ${BBB[1]}
DEF
echo ${BBB[2]}
GHI


来源:https://stackoverflow.com/questions/6654849/how-to-split-a-string-in-bash-delimited-by-tab

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!