【问题标题】:Deleting columns at specific position using perl使用perl删除特定位置的列
【发布时间】:2019-11-22 04:49:50
【问题描述】:

我是 Perl 新手,我正在尝试删除在特定位置定义的列。我的文件如下所示:

https://i.stack.imgur.com/18l5a.png

知道列的编号如下:

1-3 , 5-7 , 9-12 , 14-16 , 18-21 , 23-25 , 27-29 , 31-37 , 39-68 , 70-72 , 74

我想删除从以下位置开始的列:

1-3 , 14-16 , 23-25 , 27-29 , 31-37 , 39-68 , 70-72 , 74

所以我可以得到这个,只有列:5-7 和 9-12,但将它们的位置更改为:1-5 和 7-10

我还想在特定位置添加新列,例如 (12-21) 并获得以下结果文件:

https://i.stack.imgur.com/eQ0Yp.png.

提前谢谢你!

【问题讨论】:

  • 欢迎来到 Stack Overflow Imane。与其张贴代码图片,不如在此处添加确切的代码 sn-p。

标签: perl parsing text-files


【解决方案1】:

一种方法是使用unpack。试试这个perl p.pl < in.txt,其中p.pl 是:

while (<>) {
    my @cols = unpack "A3xA3xA4xA*", $_;
    CORE::say join ' ', $cols[2] . '  ', $cols[1], "      same";
}

更新

根据cmets中的讨论,以下解决方案解决了这个问题:

while (<>) {
    my @cols = unpack "A3xA3xA4xA*", $_;
    printf "%-5s %-5s %-4s\n", $cols[1], $cols[2], "same";
}

【讨论】:

  • 非常感谢您的回答,但我仍有问题。您会看到并非所有列的文本长度都相同,但我仍然需要每列从特定位置开始。例如第二列需要从文本文件的第七个位置开始,不管第一列的文本是多长。
  • 嗯。因此,您说第一列来自问题中的字符位置 1-3。那么它的长度总是 3,对吧?
  • 它从 1 开始,最多取 3。所以它的长度不一定是 3,它甚至可以是空的。
  • 嗯..但是第二列将不再从位置 5 开始?如果第一列的长度为零,那么第二列将从位置 1 而不是 5 开始,对吗?
  • 就是这样,无论上一列发生什么,我都希望第二列从其指定的位置 5 开始...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-05
  • 1970-01-01
  • 2011-03-07
  • 2021-03-01
相关资源
最近更新 更多