【问题标题】:How can I pad a file beyond 1024 characters in a unix environment?如何在 unix 环境中填充超过 1024 个字符的文件?
【发布时间】:2015-03-04 12:43:44
【问题描述】:

我有一个文件,我需要在 bash 脚本中将每一行用空格填充到大约 1100 个字符。文件中的每一行目前有 900 个字符。

这样做的自然方法是

awk -F, '{printf("%-1100s\n",$0)}'  src.txt > dst.txt

但是,我收到一个错误提示

awk: formatted string too long
 record number 1

经过网上的一些实验和搜索,我确定格式化字符串awk可以处理的最大行长是1024。

有没有更好的方法来解决这个限制?

(注意:我在 SunOS 5.10 上运行,无法向其中添加 GNU 工具等)

【问题讨论】:

  • 即使使用 BSD awk 也无法重现
  • 试试while read line; do printf "%1100s\n" $line; done < src.txt > dst.txt
  • n.b.,更改为左对齐并在右侧填充

标签: bash unix awk sh sunos


【解决方案1】:

获取 GNU awk。

$ awk 'BEGIN{printf "%-1100s\n", "foo"}'
     foo

您可能正在使用旧的、损坏的 awk - 在 Solaris 上使用 nawk 或 /usr/xpg4/bin/awk。如果其中一个遇到此问题,请使用另一个。

【讨论】:

  • 我看到您添加了一条注释,上面写着“我在 SunOS 5.10 上运行”。你为什么要标记你的问题 linux 呢???您可能正在使用旧的、损坏的 awk - 在 Solaris 上使用 nawk 或 /usr/xpg4/bin/awk。
  • Linux->SunOS - 更正了,我的错。
  • nawk 是答案:nawk -F, '{printf("%1100s\n",$0)}' src.txt > dst.txt
【解决方案2】:

我想出了另一种解决方案:

awk -F, '{printf("%-900s\n",$0)}'  src.txt > tmp1.txt
awk -F, '{printf("%200s\n","")}'  src.txt > tmp2.txt
paste -d "\0" tmp1.txt tmp2.txt > dst.txt

这会产生与

相同的文件
nawk -F, '{printf("%-1100s\n",$0)}' src.txt > dst.txt 

【讨论】:

  • 更像是绝望 - 10 Q
【解决方案3】:

如果您在该系统上安装了perl(可能是),您可以设置这样的脚本,然后像pad.pl input.txt 1100 > output.txt 一样运行它。

#! /usr/bin/perl

open (INPUT, "<$ARGV[0]");
$LENGTH=$ARGV[1];

while (<INPUT>) {
    chomp($_);
    while (length($_) < $LENGTH ) { $_ = $_." "; }
    print $_."\n";
}

close INPUT;

【讨论】:

  • 为什么不直接取行的长度$l 并添加($LENGTH - $l) x " " 呢?
  • 是的,我认为你可以这样做 - 它也应该更快。
【解决方案4】:

你可以试试:

awk '{ pad=1100-length($0); x = $0; 
    while (pad > 0) { x = x " "; pad--}; print x }' src.txt >dst.txt

...完全避免使用printf(),而是使用多个字符串连接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    相关资源
    最近更新 更多