我有一个文件,每行应该包含200个字符。我收到了一个每行只有100个字符的源文件。现在我需要在每行后面添加100个额外的空格。如果只是少了一些空格,我们可以使用sed命令来实现:
sed 's/$/ /' filename > newfilename
由于这是100个空格,有人能告诉我在Unix中是否可以添加吗?
如果您想每行固定 n 个字符(不信任输入文件每行正好有 m 个字符),请按照以下方法操作。适用于每行字符数各不相同的输入文件:
$ cat file
1
12
123
1234
12345
每行扩展至10个字符。
$ awk '{printf "%-10s\n", $0}' file | cat -e
1 $
12 $
123 $
1234 $
12345 $
$
表示行尾,它不是一个字符。你不需要cat -e
,这里只是为了显示行扩展。使用 awk
awk '{printf "%s%100s\n", $0, ""}' file.dat
$0
指的是整行代码。
在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个字符组成。
$_ .= " "x100
- glenn jackman-l
,所以say
有些过度,可以使用以下命令:perl -nle 'print $_," "x100' file
,或者根据Glenn的评论,可以使用隐式打印的方式:perl -ple '$_ .= " "x100' file
。 - mklement0如果您正在寻找一种 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
spaces
。 - Mark Setchellprintf
而不是 echo -e
(与大多数扩展标准行为不同,后者违反了 POSIX 标准,并且在启用 xpg_echo
和 posix
标志或在使用 --enable-xpg-echo-default
编译 bash 的 POSIX 模式下无法工作)。请参阅相关标准文档的 APPLICATION USAGE 部分。 - Charles Duffywhile IFS= read -r line
。 - Charles Duffy\\t
序列 - 由于read
上缺少-r
而需要加倍 - 被echo -e
解释并作为文字制表符发出; 顺便说一句,如果你*想要printf以外的参数中的转义序列被字面解释,你可以使用%b
显式地实现 - 但这里没有必要)。 - Charles Duffydone
之后加上> newfile
,你将只会打开输出文件一次,而不是每次运行写入它的printf
时都重新打开它并在单个printf
完成后关闭它。 - Charles Duffysed 's/$/
现在,您想要插入100个空格。您可以通过在按下空格键的同时添加一个readline参数来实现这一点,以指示您希望它发生100次,即手动输入看起来像这样的readline绑定:
M-1 0 0 \040
sed 's/$/ /' filename
在输入其余命令后使用。
这对于在交互式 shell 中工作很有用,但对于脚本而言并不太美观 - 使用其他任何解决方案都可以。
printf
:awk '{printf "%s%*.s\n", $0, 100, " "}' filename > newfile
printf
会在每个换行符的末尾添加100个空格。在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
sprintf
实际上是POSIX Awk规范的一部分,因此您的命令符合POSIX标准。轻微优化:{ print $0 s }
而不是{$0=$0 s}1
可能更快,因为输入行不必再次拆分成字段。 - mklement0