59

I am trying to get the first 22 characters from a unix data file.Here is my data looks as below.

First 12 characters is column 1 and next 10 characters is 2nd column.

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-
4

3 回答 3

108

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-22T15:54:52.017 回答
3

sudo_O 提供了很好的 cut 和 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
于 2013-01-22T16:20:23.330 回答
2

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

要读取文件,请重复获取每行的前 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

于 2020-10-18T14:41:55.843 回答