我正在尝试从unix数据中获取前22个字符,file.Here是我的数据,如下所示。
前12个字符是第1列,接下来的10个字符是第2列。
000000000001199998000180000 DUMMY RAG # MFR NOT ST 1999980 ZZ- 0 0 0ZZ-
000000000002199998000180000 DUMMY RAG # MFR NOT ST 1999980 ZZ- 0 0 0ZZ-
000000000003199998000180000 DUMMY RAG # MFR NOT ST 1999980 ZZ- 0 0 0ZZ-
000000000004199998000180000 DUMMY RAG # MFR NOT ST 1999980 ZZ- 0 0 0ZZ-
000000000005199998000180000 DUMMY RAG # MFR NOT ST 1999980 ZZ- 0 0 0ZZ-
000000000006199998000180000 DUMMY RAG # MFR NOT ST 1999980 ZZ- 0 0 0ZZ-
发布于 2013-01-22 23:54:52
使用cut
$ cut -c-22 file
0000000000011999980001
0000000000021999980001
0000000000031999980001
0000000000041999980001
0000000000051999980001
0000000000061999980001
如果我理解第二个要求,您应该将前22个字符拆分为两列,长度分别为10和12。sed
是最好的选择:
$ sed -r 's/(.{10})(.{12}).*/\1 \2/' file
0000000000 011999980001
0000000000 021999980001
0000000000 031999980001
0000000000 041999980001
0000000000 051999980001
0000000000 061999980001
发布于 2013-01-23 00:20:23
sudo_O提供了很好的剪切和sed解决方案,我只是添加了一个awk一行程序:
awk 'BEGIN{FIELDWIDTHS="22"} {print $1}' file
echo "000000000001199998000180000 DUMMY RAG"|awk 'BEGIN{FIELDWIDTHS="22"} {print $1}'
0000000000011999980001
使用空字符(这取决于您的要求,您是想跳过空格,还是想在输出中包含并计算空格)
如果应该计算空格并在输出中显示:(您不必更改上面的cmd )
echo "0 0 0 0 00000001199998000180000"|awk 'BEGIN{FIELDWIDTHS="22"} {print $1}'
0 0 0 0 00000001199998
如果你想跳过这些空格:(快速和肮脏)
echo "0 0 0 0 00000001199998000180000"|sed 's/ //g'|awk 'BEGIN{FIELDWIDTHS="22"} {print $1}'
0000000000011999980001
发布于 2020-10-18 22:41:56
这实际上可以在Bash中使用表达式${VARIABLE:offset:length}
(其中:length
是可选的)来完成,而不需要使用任何外部程序(使用这种方法的脚本必须以#!/bin/bash
而不是#!/bin/sh
开头,并且不符合POSIX shell ):
#!/bin/bash
STR="123456789"
echo ${STR:0:1}
echo ${STR:0:5}
echo ${STR:0:10}
echo ${STR:5:10}
echo ${STR:8:10}
将会有以下输出:
1
12345
123456789
6789
9
请注意,起始偏移量从零开始,长度必须至少为1。也可以使用括号中的负偏移量从字符串的右侧偏移:
echo ${STR:(-5):4}
5678
这里提供了一个非常有用的资源,可以让您了解所有关于Bash字符串操作的知识:https://tldp.org/LDP/abs/html/string-manipulation.html
https://stackoverflow.com/questions/14462529
复制相似问题