如何拆分由tab分隔的bash中的字符串

问题描述 投票:27回答:5

我正在尝试在bash中拆分制表符分隔的字段。

我知道这个答案:how to split a string in shell and get the last field

但这并不能解决制表符。

我想在tab字符之前获取字符串的一部分,所以我这样做:

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

但是\ t匹配字母't'而不是标签上。做这个的最好方式是什么?

谢谢

bash string-split
5个回答
49
投票

如果您的文件看起来像这样(使用制表符作为分隔符):

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
投票

在参数扩展中使用$'ANSI-C' strings

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

6
投票

使用awk。

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

或者,对于您的情况,来自文件最后一行的第一个字段

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

2
投票
read field1 field2 <<< ${tabDelimitedField}

要么

read field1 field2 <<< $(command_producing_tab_delimited_output)

0
投票

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

请参阅man bash中的QUOTING

© www.soinside.com 2019 - 2024. All rights reserved.