如何在 unix 环境中填充超过 1024 个字符的文件?
Posted
技术标签:
【中文标题】如何在 unix 环境中填充超过 1024 个字符的文件?【英文标题】:How can I pad a file beyond 1024 characters in a unix environment? 【发布时间】: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.,更改为左对齐并在右侧填充
【参考方案1】:
获取 GNU awk。
$ awk 'BEGINprintf "%-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()
,而是使用多个字符串连接。
【讨论】:
以上是关于如何在 unix 环境中填充超过 1024 个字符的文件?的主要内容,如果未能解决你的问题,请参考以下文章
现代 Unix/Linux 系统上的密码是不是仍限制为 8 个字符?
将 UNIX 时间从 json 导入(swift 结构)转换为日期作为字符串并填充表