如何从每行的第一个数字列开始导入

时间:2014-09-12 04:57:36

标签: shell awk

我对此非常陌生,所以如果我不清楚我会道歉,但我会尽我所能。我有一个没有从PDF创建的标题的文本文件。每一行都有点不同,因为第一列是人的名字(并且人们有不同的名字数),并且名字后面是我真正关心的列。我关心的第一列中的数据总是以数字开头。例如,我的数据如下:

John Paul Apple     8422M   JPA
John Apple       422F   JA
John Paul of the Apple    32245F  JPOTA
John    345222R   J

我尝试使用类似的东西:

awk '{$1=""; $2=""; sub("  ", " "); print}' input_filename > output_filename

但这会产生我不想要的信息,并且会丢失一些我关心的信息。是否有一个命令会将每行的第一列视为以数字开头的那一行?

我的输出文件如下所示:

8422M   JPA
422F    JA
32245F  JPOTA
345222R J

3 个答案:

答案 0 :(得分:2)

这是一个awk版本:

awk '{sub("^[^0-9]*",""); print}'

如果您希望输出看起来整洁,

awk '{sub("^[^0-9]*",""); printf "%-12s : %s\n", $1, $2}'

修改

要整齐地打印第三个字段,假设第二列数据永远不会超过8个字符宽,

awk '{sub("^[^0-9]*",""); printf "%-12s : %-8s : %s\n", $1, $2, $3}'

如果某些第二列的内容太大,它仍会被打印,推送第三列数据。 %-8s表示在字段中打印s至少8列宽,与左侧对齐,%8s会导致数据与右侧对齐。 awk使用标准的C printf格式说明符;你也可以在Python中使用它们。

答案 1 :(得分:1)

你可以试试grep,

$ grep -oP '(?: |^)\K\d.*' file
8422M   JPA
422F   JA
32245F  JPOTA
345222R   J

$ grep -oP '(?: |^)\K\d.*' file | column -t
8422M    JPA
422F     JA
32245F   JPOTA
345222R  J

$ grep -o '[0-9].*' file
8422M   JPA
422F   JA
32245F  JPOTA
345222R   J

答案 2 :(得分:1)

假设名称中没有数字(“从行的开头删除所有不是数字的数字”),

$ sed 's/^[^0-9]\{1,\}//'  input.txt  
8422M   JPA
422F   JA
32245F  JPOTA
345222R   J

或者,以下任何一种都可以使用(简化的sed + perl等价物):

$ sed 's/^[^0-9]*//'   input.txt
$ perl -pe 's/^[^0-9]*//'  input.txt