用一个输出文件替换shell脚本中的多行

时间:2013-09-05 12:09:54

标签: shell sed

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

例如,如果名称是

XXXXXX

替换为

XXXXXX        1

我尝试了以下编码。它对我有用,但无论何时更换线,它都会一次显示所有线条。 假设我在Length.txt中有40行,而在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 个答案:

答案 0 :(得分: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}

答案 1 :(得分: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

答案 2 :(得分: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

答案 3 :(得分:0)

$ awk -v FS= 'NF<9{$0=sprintf("%s%*s1",$0,8,"")} 1' file
XXXXXX        1

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