Shell:如何在文本文件的末尾添加多个新行

时间:2014-08-22 02:32:23

标签: shell text newline padding text-processing

我有一个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

2 个答案:

答案 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