如何在unix数据文件中获取前n个字符

时间:2013-01-22 15:50:35

标签: linux unix awk cut

我正在尝试从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-

3 个答案:

答案 0 :(得分:69)

使用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

答案 1 :(得分:3)

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

答案 2 :(得分:0)

这实际上可以在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

请注意,起始偏移量从零开始,并且长度必须至少为一。您还可以使用括号中的负偏移量从字符串的右侧偏移量:

echo ${STR:(-5):4}

5678

您需要了解有关Bash字符串操作的所有知识的非常有用的资源:https://tldp.org/LDP/abs/html/string-manipulation.html