我有一个shell脚本,它通过将0s填充到较短的行来确保文本文件中的所有行具有相等的长度。
在填充线条之前,我想在文本文件的 end 中添加新行,使行数等于行的最大长度。例如,如果文本文件包含:
text
longerText
short
输出文件应为:
text000000
longerText
short00000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
我尝试使用this帖子的解决方案,但无法使其正常运行。
这是我的shell脚本,然而,它将新行添加到文件的开头,而不是结尾。
#!/bin/bash
inputFile=~/home/vm/inputText
maxLength=$(awk '{print length($0)}' ${inputFile} | sort -nr | head -1)
numRows=$(wc -l < ${inputFile})
for (( i=numRows; i<=${maxLength}; i++ )); do
#sed -i -e '$a\' ${inputFile}
echo
done
while read -r; do
printf "%s" "$REPLY"
for (( i=1; i<=((${maxLength} - ${#REPLY})); i++ )); do
printf "%s" "0"
done
printf "\n"
done < ${inputFile}
### To run
###./thisScript.sh > outputFile.txt
答案 0 :(得分:0)
awk
:
我们读了两次文件。在第一次运行中,我们通过查看每一行找到最大长度。在第二次运行中,我们根据最大长度根据需要打印线条填充。在END
块中,我们打印任何填充线以满足最大长度标准。
awk '
NR==FNR {
max = (max > length($0) ? max : length($0));
next
}
{
printf "%0*s\n", max, $0;
next
}
END {
for (i=1; i<=(max-FNR); i++)
printf "%0*s\n", max, "0"
}' file file
输出:
000000text
longerText
00000short
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
直接支持右边填充,但您可以自行解决方案。
awk '
NR==FNR {
max = (max > length($0) ? max : length($0));
next
}
{
printf "%s%0*s\n", $0, max-length($0), (max-length($0)==0?"":"0");
next
}
END {
for (i=1; i<=(max-FNR); i++)
printf "%0*s\n", max, "0"
}' file file
输出:
text000000
longerText
short00000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
答案 1 :(得分:0)
新行首先打印,因为这是您的脚本首先执行的操作。如果你想在最后添加换行符,请在WHILE循环后移动FOR循环。
更新:然后您可以将FOR循环更改为此类似的内容。请注意,您必须动态创建模式字符串
pattern="%05d\n"; #hard-coded to pad to 5 0s
for (( i=numRows; i<=${maxLength}; i++ )); do
#sed -i -e '$a\' ${inputFile}
printf $pattern
done