0

我有一个文件Length.txt逐行具有多个名称(40)。我想编写一个小的 shell 脚本,它将计算文件每一行的字符数,如果计数小于 9,则在每行末尾添加额外的 8 个空格和 1 替换这些行。

例如,如果名称是

XXXXXX

替换为

XXXXXX        1

我尝试使用以下编码。它对我有用,但是每当它替换行时,它都会一次显示所有行。所以假设我有 40 行Length.txt进出这 4 行,字符数少于 9,那么我的输出有 160 行。谁能帮我用 4 条更改的线只显示 40 条线的输出?

#!/usr/bin/sh
#set -x

while read line;
do
count=`echo $line|wc -m`
        if [ $count -lt 9 ]
        then
        Number=`sed -n "/$line/=" Length.txt`;
        sed -e ""$Number"s/$line/$line       1/" Length4.txt
        fi
done < Length.txt
4

4 回答 4

2

一个 sed 命令可以做到这一点:

sed -E 's/^.{,8}$/&        1/' file

要修改文件的内容,请添加-i

sed -iE 's/^.{,8}$/&        1/' file

部分输出:

94605320        1
105018263
2475218231
7728563        1
        1

* 修正为只包含 8 个空格而不是 9 个,并且包含空行。如果您不想处理空行,请使用{1,8}.

于 2013-09-05T12:37:36.373 回答
1

让我告诉你你的脚本有什么问题。您的脚本中唯一缺少的是您需要用于sed -i编辑文件并在替换后重新保存它。

我假设 Length4.txt 只是 Length.txt 的副本?

我添加sed -i到您的脚本中,它现在应该可以工作了:

cp Length.txt Length4.txt
while read line;
do
count=`echo $line|wc -m`
        if [ $count -lt 9 ]
        then
        Number=`sed -n "/$line/=" Length.txt`
        sed -ie ""$Number"s/$line/$line       1/" Length4.txt
        fi
done < Length.txt

但是,您不需要sedwc。您可以按如下方式简化脚本:

while IFS= read -r line
do
    count=${#line}
    if (( count < 9 ))
    then
        echo "$line        1"
    else 
        echo "$line"
    fi
done < Length.txt > Length4.txt
于 2013-09-05T12:29:47.797 回答
1
$ cat foo.input
I am longer than 9 characters
I am also longer than 9 characters
I am not
Another long line
short

$ while read line; do printf "$line"; (( ${#line} < 9 )) && printf "        1"; echo; done < foo.input
I am longer than 9 characters
I am also longer than 9 characters
I am not        1
Another long line
short        1
于 2013-09-05T12:26:16.240 回答
0
$ awk -v FS= 'NF<9{$0=sprintf("%s%*s1",$0,8,"")} 1' file
XXXXXX        1

请注意,检查 9 个字符以外的数字并打印 8 个以外的一些空白序列是多么简单。

于 2013-09-05T17:37:13.707 回答