Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在bash中拆分由tab分隔的字符串_Bash_String Split - Fatal编程技术网

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

如何在bash中拆分由tab分隔的字符串,bash,string-split,Bash,String Split,我正在尝试在bash中拆分选项卡分隔的字段 我知道这个答案: 但这并不适用于制表符字符 我想在制表符之前获取字符串的一部分,所以我要这样做: x=`head -1 my-file.txt` echo ${x%\t*} 但是\t在字母“t”上匹配,而在选项卡上不匹配。最好的方法是什么 谢谢使用awk echo $yourfield | awk '{print $1}' 或者,在您的情况下,对于文件最后一行的第一个字段 tail yourfile | awk '{x=$1}END{print x

我正在尝试在bash中拆分选项卡分隔的字段

我知道这个答案:

但这并不适用于制表符字符

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

x=`head -1 my-file.txt`
echo ${x%\t*}
但是\t在字母“t”上匹配,而在选项卡上不匹配。最好的方法是什么

谢谢使用awk

echo $yourfield | awk '{print $1}'
或者,在您的情况下,对于文件最后一行的第一个字段

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

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

您可以使用
cut
提取第一个字段(默认情况下在选项卡上操作):

如果使用的是
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
最后,使用
sed

$ sed '$s/\(^[^\t]*\).*$/\1/' input
10:1st-field
这里,
$
是范围运算符;i、 e.仅在最后一行操作

对于原始问题,请使用文字选项卡,即

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

$ ./tab.sh 
10:1st-field
1st-field
在参数展开中使用:

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


请参见
manbash

readfield1 field2中的QUOTING,有一种简单的方法可以使用制表符分隔的字符串:将其转换为数组

read field1 field2 <<< ${tabDelimitedField}
创建带制表符的字符串($在“\t”解释之前添加):

使用括号将字符串拆分为数组:

BBB=($AAA) 
访问任何元素:

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

谢谢-就是这样,有一个更正:awk-F“\t”{x=$1}END{print x}'默认的awk字段分隔符是空白,其中包括制表符,但可能您的应用程序需要缩小它。请补充您的代码,只回答一些解释,以减少StackOverflow是免费代码编写服务的印象。如果您正在命令行上制作一个方便的单行程序,您可以按Ctrl+V,然后按tab要插入制表符。对于我来说,此解决方案使用
$'\t'
中的
{}
参数扩展,符合OP的要求。我用它将我的脚本速度提高了76%,超过了使用多个管道来
剪切
。不幸的是,如果项目可以是零长度字符串,这将不起作用,例如
AAA=$'a\t\tc'
确实是个坏消息-(谢谢你的通知。但到目前为止我很幸运,它对我的脚本起到了作用。
read field1 field2 <<< ${tabDelimitedField}
read field1 field2 <<< $(command_producing_tab_delimited_output)
AAA=$'ABC\tDEF\tGHI'
BBB=($AAA) 
echo ${BBB[0]}
ABC
echo ${BBB[1]}
DEF
echo ${BBB[2]}
GHI