【问题标题】:Adding blank cells in huge file [closed]在大文件中添加空白单元格[关闭]
【发布时间】:2016-10-09 10:37:39
【问题描述】:

我有一个看起来像这样的大文件:

125552552
126382233
454654654
548652545
876544545

我想这样添加 25 个空白单元格:

                                       125552552
                                       126382233
                                       454654654
                                       548652545
                                       876544545

我知道有一种方法可以通过 awk 或 sed...

【问题讨论】:

  • sed 's/^/                        /' (我在其中输入了 25 个空格,但 SO Markdown 可能删除了其中大部分;最好使用一些   不间断空格,但该死的繁琐)。
  • 似乎是 X-Y 问题。下一步将使用这些空间做什么?

标签: perl shell unix awk sed


【解决方案1】:

任你选:

$ awk '{printf "%34s\n", $0}' file
                         125552552
                         126382233
                         454654654
                         548652545
                         876544545

$ awk '{printf "%25s%s\n", "", $0}' file
                         125552552
                         126382233
                         454654654
                         548652545
                         876544545

$ awk '{printf "%*s\n", length()+25, $0}' file
                         125552552
                         126382233
                         454654654
                         548652545
                         876544545

$ awk 'BEGIN{s=sprintf("%25s","")} {printf "%s%s\n", s, $0}' file
                         125552552
                         126382233
                         454654654
                         548652545
                         876544545

【讨论】:

  • + 为%*s...永远向你学习。
【解决方案2】:

这两个都读取文件filename 的每一行并打印出来,前面有25 个空格,所有内容都被重定向到一个文件。您可以使用任一

perl -ne 'print " " x 25 . $_' filename  > outfile

perl -pe '$_ = " " x 25 . $_' filename   > outfile

这些命令对于所有实际目的都是相同的,并且如果文件很大,它们都是逐行读取文件的。 > outfile 将输出重定向到具有该名称的文件。


上面的每个示例都是一个完整的命令行程序,在终端中输入并执行。开关

  • -e 表示以下单引号 '...' 之间的所有内容都将由 Perl 作为程序执行。它可以是任何有效的 Perl 代码。

不过,这些单线小程序还带来了额外的便利。

  • -n 在标准输入上设置一个循环,因此在命令之后提交的文件(上面的filename)被逐行读取,'' 之间的任何代码都会在其每个文件上执行线依次。所以我们不必手动打开文件并遍历其行。

  • -p-n 的作用相同,但更方便 - 它在处理完该行后打印该行。所以如果我们想要打印每一行,我们可以使用-p 而不必说print。上面的第二个例子使用了这个。

  • -i 更改下面使用的“就地”输入文件。也可以进行备份,请参阅文档。

  • 每一行都被读入默认变量$_,Perl 中的许多工具默认对其进行操作(如果没有变量传递给它们)。例如,要打印一行我们通常只说print。这里每一行都需要处理,所以我明确地使用$_,但大多数时候我们没有。

还有很多,见perlrun


注意,由andlrc 在评论中提供——也可以将$" 用于单个空格

perl -pe '$_ = $"x25 . $_' filename  > outfile

来自Special Variables in perlrun

  • $"
    当数组或数组切片插入双引号字符串或类似的上下文(例如 /.../ )时,其元素由该值分隔。默认为空格。

要更改原始文件,请添加开关-i,用于“就地”。这适用于以上任一版本

perl -i -ne 'print " " x 25 . $_' filename

在此之后,输入 filename 将被更改(因此每行前面有 25 个空格)。可以保存原始文件的备份,请参阅Command switches in perlrun

【讨论】:

  • -p 不会 chomp 输入,-l 会(也设置了$\ = "\n")。你可以用-p重新分配$_perl -pe '$_ = $"x25 . $_' filename
  • @andlrc 哦……谢谢。我有时会忘记并混淆它们,这很烦人。谢谢你。 $"x25 的那个技巧我不知道!我正在添加它,并且必须将其循环起来:) 谢谢:)。
  • 使用 -l 设置:$\ = "\n",它被添加到每个打印语句之前。尝试运行:perl -e 'print for 1..3' vs perl -le 'print for 1..3'
  • 了解每个标志的运行情况的好方法是:perl -MO=Deparse -e '',例如:perl -MO=Deparse -n -e ''
  • @andlrc 是的,谢谢,这可能就是我将它们混为一谈的原因。我删除了它,这里的重点是让它简单明了。感谢$",我实际上根本不知道那个。我使用Deparse,这是一个很棒的工具。我最近在这里发了一篇文章,实际上是单行的。感谢您解决此问题:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-25
  • 1970-01-01
  • 1970-01-01
  • 2016-03-14
  • 2020-03-30
相关资源
最近更新 更多