cha*_*imp 29 bash string-split
我正在尝试在bash中拆分制表符分隔字段.
我知道这个答案:如何在shell中拆分字符串并获取最后一个字段
但这并不能解决制表符.
我想在tab字符之前获取字符串的一部分,所以我这样做:
x=`head -1 my-file.txt`
echo ${x%\t*}
Run Code Online (Sandbox Code Playgroud)
但是\ t匹配字母't'而不是标签上.做这个的最好方式是什么?
谢谢
Fre*_*ihl 56
如果您的文件看起来像这样(使用制表符作为分隔符):
1st-field 2nd-field
Run Code Online (Sandbox Code Playgroud)
您可以使用cut提取第一个字段(默认情况下在选项卡上操作):
$ cut -f1 input
1st-field
Run Code Online (Sandbox Code Playgroud)
如果您正在使用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
Run Code Online (Sandbox Code Playgroud)
使用awk的解决方案:
$ awk 'END {print $1}' input
10:1st-field
Run Code Online (Sandbox Code Playgroud)
纯粹的bash解决方案:
#!/bin/bash
while read a b;do last=$a; done < input
echo $last
Run Code Online (Sandbox Code Playgroud)
输出:
$ ./tab.sh
10:1st-field
Run Code Online (Sandbox Code Playgroud)
最后,使用的解决方案 sed
$ sed '$s/\(^[^\t]*\).*$/\1/' input
10:1st-field
Run Code Online (Sandbox Code Playgroud)
这里$是范围运营商; 即仅在最后一行操作.
对于您的原始问题,请使用文字选项卡,即
x="1st-field 2nd-field"
echo ${x% *}
Run Code Online (Sandbox Code Playgroud)
输出:
1st-field
Run Code Online (Sandbox Code Playgroud)
gle*_*man 13
在参数扩展中使用$'ANSI-C'字符串:
$ x=$'abc\tdef\tghi'
$ echo "$s"
abc def ghi
$ echo ">>${x%%$'\t'*}<<"
>>abc<<
Run Code Online (Sandbox Code Playgroud)
使用awk.
echo $yourfield | awk '{print $1}'
Run Code Online (Sandbox Code Playgroud)
或者,对于您的情况,来自文件最后一行的第一个字段
tail yourfile | awk '{x=$1}END{print x}'
Run Code Online (Sandbox Code Playgroud)
小智 6
read field1 field2 <<< ${tabDelimitedField}
Run Code Online (Sandbox Code Playgroud)
要么
read field1 field2 <<< $(command_producing_tab_delimited_output)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
76229 次 |
| 最近记录: |