Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 在大文件中添加空白单元格_Perl_Shell_Unix_Awk_Sed - Fatal编程技术网

Perl 在大文件中添加空白单元格

Perl 在大文件中添加空白单元格,perl,shell,unix,awk,sed,Perl,Shell,Unix,Awk,Sed,我有一个巨大的文件,看起来像: 125552552 126382233 454654654 548652545 876544545 我想这样添加25个空白单元格: 125552552 126382233 454654654 548652545 876544545 我知道有一种方法可以通过awk或sed来实现…这两种方法都读取文件的每一行文件名,然后用25个空格将其打印出来,所有内容都重定向到一个文件。你可以用任何一种 perl -ne 'print " " x 25 . $_' filena

我有一个巨大的文件,看起来像:

125552552
126382233
454654654
548652545
876544545
我想这样添加25个空白单元格:

125552552
126382233
454654654
548652545
876544545

我知道有一种方法可以通过awk或sed来实现…

这两种方法都读取文件的每一行
文件名
,然后用25个空格将其打印出来,所有内容都重定向到一个文件。你可以用任何一种

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

这些命令在所有实际用途中都是相同的,并且都逐行读取文件,如果文件很大,这就是您想要的。
>outfile
将输出重定向到具有该名称的文件


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

  • -e
    意味着以下单引号之间的所有内容,
    '…'
    都将由Perl作为程序执行。它可以是任何有效的Perl代码
然而,这些一行迷你程序带来了额外的便利

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

  • -p
    的功能与
    -n
    的功能相同,但有一个额外的便利性,即处理后打印行。因此,如果我们想打印每一行,我们可以使用
    -p
    ,而不必说
    打印
    。上面的第二个例子就是这样的

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

  • 每一行都被读入默认变量
    $\uuz
    ,Perl中的许多工具在默认情况下对其进行操作(如果没有向它们传递任何变量)。例如,要打印一行,我们通常只说
    print
    。这里每一行都需要被操作,所以我显式地使用了
    $\uu
    ,但大多数时候我们没有

还有很多,请看


注意,由在注释中提供--也可以使用
$”
表示单个空白

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

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

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

perl -i -ne 'print " " x 25 . $_' filename
在此之后,输入的
文件名
将被更改(因此每行有25个空格)。可以保存原始文件的备份,请参阅。

选择:

$ 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

sed's/^/'
(我在这里输入了25个空格,但降价可能删除了其中的大部分;最好使用一些不间断的空格,但非常灵活)。看起来像是X-Y问题。下一步将使用空格做什么?+用于
%*s
。。。始终从u学习。
-p
不会选择输入,而
-l
会选择输入(这也会设置
$\=“\n”
)。你可以用
-p
重新分配
$\ucode>:
perl-pe'$\u=$“x25.$\u'文件名
@和lrc哦…谢谢你。我有时会忘记并混淆它们,这很烦人。谢谢你。
$”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'
@和lrc是的,谢谢,这可能就是我把它们混在一起的原因。我删除了它,这里的重点是让它简单明了。谢谢你的
$”
,我其实一点都不知道。我用的是
Deparse
,这是一个非常好的工具。我最近在这里用它发了一篇帖子,实际上是一行。谢谢你修复这个:)
$ 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