0

我在制表符分隔的列中有这样的数据:

1   name1   attribute1
1   name1   attribute2
1   name1   attribute3
31  name2   attribute1
31  name2   attribute2
31  name2   attribute3
444 name3   attribute1
444 name3   attribute2
444 name3   attribute3

我想要这样:

001 name1   attribute1
001 name1   attribute2
001 name1   attribute3
031 name2   attribute1
031 name2   attribute2
031 name2   attribute3
444 name3   attribute1
444 name3   attribute2
444 name3   attribute3

例如,我可以在 unix 或 perl 中执行此操作吗?

4

3 回答 3

5
perl -i~ -pe's/^(\d+)/sprintf "%03d", $1/e' file

实际上,上述检查超出了它的需要。这是一个更通用的解决方案:

perl -i~ -pe's/^([^\t]*)/sprintf "%03s", $1/e' file
于 2012-10-04T16:44:21.853 回答
1

awk 和 Perl 的答案都很棒。我还要补充一点,在 Perl 中,如果您不提前知道第一列中有多少位数,您可以将“%03d”部分中的“3”替换为包含第一列中最长数字的长度。

于 2012-10-05T02:07:27.177 回答
0

这是一种使用方法GNU awk

awk -v OFS="\t" '{ $1 = sprintf ("%03d", $1) }1' file.txt
于 2012-10-04T23:08:15.257 回答