我正在尝试从 unix 数据文件中获取前 22 个字符。这是我的数据如下所示。
前 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-
带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
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
实际上可以在 Bash 中完成,而无需使用任何外部程序(使用它的脚本必须以 #!/bin/bash
开头而不是 #!/bin/sh
并且不符合 POSIX shell 标准),使用表达式 ${VARIABLE:offset:length}
(其中:length
是可选的):
#!/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
要读取文件,重复获取每行的前 8 个字符,并将它们打印到终端,请使用如下所示的while
循环:
while read LINE
do echo "${STD:0:8}"
done < "/path/to/the/text_file"
这里有一个非常有用的资源,你可以了解所有关于 Bash 字符串操作的知识:https://tldp.org/LDP/abs/html/string-manipulation.html