如何在bash中拆分由制表符分隔的字符串
我正在尝试在 bash 中拆分制表符分隔的字段。
我知道这个答案:如何在 shell 中分割字符串并获取最后一个字段
但这并不能回答制表符。
我想获取制表符之前的字符串部分,所以我这样做:
x=`head -1 my-file.txt`
echo ${x%\t*}
但是 \t 匹配字母“t”而不是制表符。最好的方法是什么?
谢谢
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
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
如果您的文件看起来像这样(以制表符作为分隔符):
您可以使用
cut
提取第一个字段(默认在制表符上操作):如果您使用
awk
>,不需要使用tail
来获取最后一行,将输入更改为:使用 awk 的解决方案:
Pure bash-solution:
输出:
最后,使用
sed
的解决方案>这里,
$
是范围 操作员;即仅对最后一行进行操作。对于您原来的问题,使用文字选项卡,即
输出:
If your file look something like this (with tab as separator):
you can use
cut
to extract the first field (operates on tab by default):If you're using
awk
, there is no need to usetail
to get the last line, changing the input to:Solution using awk:
Pure bash-solution:
outputs:
Lastly, a solution using
sed
here,
$
is the range operator; i.e. operate on the last line only.For your original question, use a literal tab, i.e.
outputs:
使用
$'ANSI-C'
字符串 在参数扩展中:Use
$'ANSI-C'
strings in the parameter expansion:使用 awk。
或者,在您的情况下,对于文件最后一行的第一个字段
Use awk.
or, in your case, for the first field from the the last line of a file
或者
or
对于制表符分隔的字符串有一个简单的方法:将其转换为数组。
创建带有制表符的字符串(之前添加 $ 以进行 '\t' 解释):
使用括号将字符串拆分为数组:
获取对任何元素的访问权限:
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) :
Split the string as an array using parenthesis :
Get access to any element :
请参阅
man bash
中的引用See QUOTING in
man bash
https://stackoverflow.com/users/1815797/gniourf-gniourf 的答案暗示了使用内置在 bash 的字段解析中,但并没有真正完成答案。使用 IFS shell 参数来单独设置输入字段将完成图片,并提供在纯 bash 中解析固定数量字段的制表符分隔文件的能力。
当然,其中替换为真正的制表符,而不是 \t。通常,Control-V Tab 在终端中执行此操作。
The answer from https://stackoverflow.com/users/1815797/gniourf-gniourf hints at the use of built in field parsing in bash, but does not really complete the answer. The use of the IFS shell parameter to set the input field separate will complete the picture and give the ability to parse files which are tab-delimited, of a fixed number of fields, in pure bash.
Where, of course, is replaced by a real tab, not \t. Often, Control-V Tab does this in a terminal.