我对此非常陌生,所以如果我不清楚我会道歉,但我会尽我所能。我有一个没有从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
答案 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