如何在Unix中给文件的每一行末尾添加100个空格?

11

我有一个文件,每行应该包含200个字符。我收到了一个每行只有100个字符的源文件。现在我需要在每行后面添加100个额外的空格。如果只是少了一些空格,我们可以使用sed命令来实现:

 sed 's/$/     /' filename > newfilename

由于这是100个空格,有人能告诉我在Unix中是否可以添加吗?


你想要一个固定的字段长度为200个字符,每行都添加一些空格使其达到200个字符的长度,还是只想在现有的行中添加100个空格? - dawg
7个回答

7

如果您想每行固定 n 个字符(不信任输入文件每行正好有 m 个字符),请按照以下方法操作。适用于每行字符数各不相同的输入文件:

$ cat file
1
12
123
1234
12345

每行扩展至10个字符。

$ awk '{printf "%-10s\n", $0}' file | cat -e

1         $
12        $
123       $
1234      $
12345     $

显然,在你的脚本中将10改为200。这里的$表示行尾,它不是一个字符。你不需要cat -e,这里只是为了显示行扩展。

3

使用 awk

awk '{printf "%s%100s\n", $0, ""}' file.dat

$0指的是整行代码。


3

在Glenn的建议下进行了更新

有点像Glenn在评论中建议的那样,替换是不必要的,你只需要添加空格即可。不过,如果进一步思考这个逻辑,你甚至不需要添加,只需在原始行后面它们即可。

perl -nlE 'say $_," "x100' file

Original Answer

With Perl:

perl -pe 's/$/" " x 100/e' file

这段话的意思是... “将每行末尾($)替换为100个空格(e)的计算表达式”.

如果您想将所有行填充到例如200个字符,即使输入文件不规则(所有行长度不同),您可以使用类似以下的内容:

perl -pe '$pad=200-length;s/$/" " x $pad/e'

这将使每行字符数为200个,分别由83、102和197个字符组成。


3
不需要搜索和替换。只需将空格添加到行末:$_ .= " "x100 - glenn jackman
做得很好;由于您使用了-l,所以say有些过度,可以使用以下命令:perl -nle 'print $_," "x100' file,或者根据Glenn的评论,可以使用隐式打印的方式:perl -ple '$_ .= " "x100' file - mklement0

2

如果您正在寻找一种 bash 解决方案,

while IFS=  read -r line
    do
    printf "%s%100s\n" "$line" 
done < file > newfile

测试

假设我有一个文件,其中包含3行内容:

$ wc -c file
      16 file
$ wc -c newfile
     316 newfile

Original Answer

spaces=$(echo {1..101} | tr -d 0-9)
while read line
    do
    echo -e "${line}${spaces}\n" >> newfile
done < file

2
为了提高效率,您可以在循环之外计算spaces - Mark Setchell
1
考虑使用 printf 而不是 echo -e(与大多数扩展标准行为不同,后者违反了 POSIX 标准,并且在启用 xpg_echoposix 标志或在使用 --enable-xpg-echo-default 编译 bash 的 POSIX 模式下无法工作)。请参阅相关标准文档的 APPLICATION USAGE 部分。 - Charles Duffy
1
请注意,在循环中清除IFS并将-r标志传递给read命令,否则您将删除现有的尾随空格并删除反斜杠!因此,请使用以下代码:while IFS= read -r line - Charles Duffy
是的。 (它还防止像输入文档中的\\t序列 - 由于read上缺少-r而需要加倍 - 被echo -e解释并作为文字制表符发出; 顺便说一句,如果你*想要printf以外的参数中的转义序列被字面解释,你可以使用%b显式地实现 - 但这里没有必要)。 - Charles Duffy
1
还有一点需要注意--如果在done之后加上> newfile,你将只会打开输出文件一次,而不是每次运行写入它的printf时都重新打开它并在单个printf完成后关闭它。 - Charles Duffy
显示剩余6条评论

2
如果您使用Bash,仍然可以使用sed,但是可以使用一些readline功能来避免手动输入100个空格(请参见“Readline arguments”手册)。
您可以正常开始输入:
sed 's/$/

现在,您想要插入100个空格。您可以通过在按下空格键的同时添加一个readline参数来实现这一点,以指示您希望它发生100次,即手动输入看起来像这样的readline绑定:

M-1 0 0 \040

或者,如果您的元键是alt键:Alt+100Space 这将插入100个空格,您将得到:
sed 's/$/                                                                                                    /' filename

在输入其余命令后使用。

这对于在交互式 shell 中工作很有用,但对于脚本而言并不太美观 - 使用其他任何解决方案都可以。


1
您可以在awk中使用printf
awk '{printf "%s%*.s\n", $0, 100, " "}' filename > newfile

这个printf会在每个换行符的末尾添加100个空格。

1

在GNU awk中,另一种方法是使用sprintf字符串操作函数。

awk 'BEGIN{s=sprintf("%-100s", "");}{print $0 s}' input-file > file-with-spaces

一个带有例子的证明:-
$ cat input-file
1234jjj hdhyvb 1234jjj
6789mmm mddyss skjhude
khora77 koemm  sado666
nn1004  nn1004 457fffy
$ wc -c input-file
      92 input-file
$ awk 'BEGIN{s=sprintf("%-100s", "");}{print $0 s}' input-file > file-with-spaces
$ wc -c file-with-spaces
      492 file-with-spaces

1
++用于仅生成一次空格字符串。sprintf实际上是POSIX Awk规范的一部分,因此您的命令符合POSIX标准。轻微优化:{ print $0 s }而不是{$0=$0 s}1可能更快,因为输入行不必再次拆分成字段。 - mklement0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接