我有一个文件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
答案 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
但是,您不需要sed
或wc
。您可以按如下方式简化脚本:
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之外的一些空白序列是多么简单。