shell脚本 语法错误

乞丐的生鱼片 2015-08-14 09:48:48
我想做一个脚本,就是读取文件长度最长的前100行,然后让用户输入删除的行数进行删除,可是不知道为什么会有语法错误,本人新手,求大神帮忙
shell脚本如下:
#!/bin/bash
str=`cat """${1}""" | awk '{print NR,length($0),$0}' | sort -k2,2nr | head -n 100`
echo -n "此为最长的100数据,请输入删除行数[0-100]:"
read line
if[ "${line}" -lt "0" -a "${line}" -gt "100" ]
then
echo -n "输入错误"
else
list=`cat """${1}""" | awk '{print NR,length($0),$0}' | sort -k2,2nr | cut -d' ' -f1 | head -n ${line}`
for val in $list
do
sed -i "${val}d" """${1}"""
done
fi



出错如下
': 不是有效的标识符etl/Test/ShellData/行的字符数太小/t.sh: 第 4 行:read: `line
/cygdrive/e/source/etl/Test/ShellData/行的字符数太小/t.sh:行5: $'if[ -lt 0 -a -gt 100 ]\r': 未找到命令
/cygdrive/e/source/etl/Test/ShellData/行的字符数太小/t.sh:行6: $'then\r': 未找到命令
/cygdrive/e/source/etl/Test/ShellData/行的字符数太小/t.sh:行8: $'else\r': 未找到命令
head: option requires an argument -- n
Try 'head --help' for more information.
/cygdrive/e/source/etl/Test/ShellData/行的字符数太小/t.sh:行9: $'\r': 未找到命令
/cygdrive/e/source/etl/Test/ShellData/行的字符数太小/t.sh:行11: 未预期的符号 `$'do\r'' 附近有语法错误
'cygdrive/e/source/etl/Test/ShellData/行的字符数太小/t.sh:行11: ` do
...全文
551 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
乞丐的生鱼片 2015-08-21
  • 打赏
  • 举报
回复
我的有些文件,竟然不支持。。编码问题么。。 sort: 字符串比较出现错误: Invalid or incomplete multibyte or wide character sort: 请设置LC_ALL='C' 以避免出现问题。 sort: 要比较的字符串为"86799 37 hizhufei2\tnancyvinluan@aol.com shane\t" 和"86805 37 hi\303\300Ů\tnancywandia2001@yahoo.com mundia\t"。
忘世麒麟 2015-08-17
  • 打赏
  • 举报
回复
引用 10 楼 whenyumen 的回复:
[quote=引用 8 楼 baijiaheizhiganmao 的回复:] 运行通过,有问题私信我.
大牛的脚本,我当学习了,领导要求他能看懂的,最后还是我改好了,不过还是谢谢你,让我学会了很多[/quote] 我写的比你的低级多了.你看我写了一大堆,而你仅仅几行.
乞丐的生鱼片 2015-08-16
  • 打赏
  • 举报
回复
引用 8 楼 baijiaheizhiganmao 的回复:
运行通过,有问题私信我.
大牛的脚本,我当学习了,领导要求他能看懂的,最后还是我改好了,不过还是谢谢你,让我学会了很多
乞丐的生鱼片 2015-08-16
  • 打赏
  • 举报
回复
引用 6 楼 q3733353520 的回复:
[quote=引用 5 楼 whenyumen 的回复:] [quote=引用 3 楼 q3733353520 的回复:] if和 [ 之间要有空格
已经更改,可是现在报错 是模糊的重定向 str=`cat """${1}""" | awk '{print NR,length($0),$0}' | sort -k2,2nr | head -n 100` echo "${str}" echo "此为最长的100数据,请输入删除行数[0-100]:" read line ssed="" if [ "${line}" -le "0" -o "${line}" -gt "100" ] then echo "输入错误,请重新输入" else printf "line : %s \n" "${line}" list=`cat """${1}""" | awk '{print NR,length($0),$0}' | sort -k2,2nr | cut -d' ' -f1 | head -n ${line}` while read i do ssed=${ssed}${i}"d;" echo "${ssed}" done < `echo ${list}` #改成这样 done <<< 'echo ${list}' echo "${ssed}" echo "sed -i '"${ssed}"' """${1}"""" fi [/quote]
done < `echo ${list}`  #改成这样  done <<< 'echo ${list}'
[/quote] 不知道为什么会有问题,不过我写回文件,又用<这个成功了,谢谢
乞丐的生鱼片 2015-08-14
  • 打赏
  • 举报
回复
没人么,大神
乞丐的生鱼片 2015-08-14
  • 打赏
  • 举报
回复
有人么,求助攻
忘世麒麟 2015-08-14
  • 打赏
  • 举报
回复
运行通过,有问题私信我.
忘世麒麟 2015-08-14
  • 打赏
  • 举报
回复

#读取文件长度最长的前100行,然后让用户输入删除的行数进行删除
#!/bin/bash
#定义一个表示要输出行数的变量,比如N=100
N=5;
filecontent='';
linecount='';
splite='-';
content=`cat file2read.txt`; 
while read line
do
	filecontent=${filecontent}${line}${splite};
	linecount=${linecount}${#line}${splite};
done<<<"${content}"
#去掉最后一个分隔符
filecontent=${filecontent%?};
linecount=${linecount%?};


#将字符串分隔为数组
OLD_IFS="$IFS";
IFS="-";
file=($filecontent);
count=($linecount);
temp=($linecount)
IFS="$OLD_IFS";

#输出数组最大的前N(N=5)个元素
#sort it first
for (( i=0 ; i<${#temp[@]} ; i++ ))
do
	for (( j=${#temp[@]} - 1 ; j>i ; j-- ))
	do
		if  [[ ${temp[j]} -gt ${temp[j-1]} ]]
		then
			t=${temp[j]}
			temp[j]=${temp[j-1]}
			temp[j-1]=$t
		fi
	done
done

#按从大到小顺序输出长度最长的前N行
for ((i=0;i<$N;i++))
do
	for ((j=0;j<${#count[@]};))
	do
		if [[ ${count[j]} -eq ${temp[i]} ]]
		then
			echo ${file[j]}
			break;
		else
			 j=$[$j+1]
		fi
	done	
done

#处理用户输入
echo -n "请输入要删除的行:"
read num
echo $num
num=$[$num-1]
for (( j=0;j<${#count[@]};))
do
	if [[ ${count[j]} -eq ${temp[num]} ]]
	then
		unset file[j]
		break;
	else
		j=$[$j+1]
	fi
done

#数据写回文件
>file2read.txt
for (( j=0;j<${#file[@]};j++))
do
	if [[ ${#file[j]} -gt 0 ]]
	then
		echo ${file[j]}>>file2read.txt	 	 
	fi
done

  • 打赏
  • 举报
回复
引用 5 楼 whenyumen 的回复:
[quote=引用 3 楼 q3733353520 的回复:] if和 [ 之间要有空格
已经更改,可是现在报错 是模糊的重定向 str=`cat """${1}""" | awk '{print NR,length($0),$0}' | sort -k2,2nr | head -n 100` echo "${str}" echo "此为最长的100数据,请输入删除行数[0-100]:" read line ssed="" if [ "${line}" -le "0" -o "${line}" -gt "100" ] then echo "输入错误,请重新输入" else printf "line : %s \n" "${line}" list=`cat """${1}""" | awk '{print NR,length($0),$0}' | sort -k2,2nr | cut -d' ' -f1 | head -n ${line}` while read i do ssed=${ssed}${i}"d;" echo "${ssed}" done < `echo ${list}` #改成这样 done <<< 'echo ${list}' echo "${ssed}" echo "sed -i '"${ssed}"' """${1}"""" fi [/quote]
done < `echo ${list}`  #改成这样  done <<< 'echo ${list}'
乞丐的生鱼片 2015-08-14
  • 打赏
  • 举报
回复
引用 3 楼 q3733353520 的回复:
if和 [ 之间要有空格
已经更改,可是现在报错 是模糊的重定向 str=`cat """${1}""" | awk '{print NR,length($0),$0}' | sort -k2,2nr | head -n 100` echo "${str}" echo "此为最长的100数据,请输入删除行数[0-100]:" read line ssed="" if [ "${line}" -le "0" -o "${line}" -gt "100" ] then echo "输入错误,请重新输入" else printf "line : %s \n" "${line}" list=`cat """${1}""" | awk '{print NR,length($0),$0}' | sort -k2,2nr | cut -d' ' -f1 | head -n ${line}` while read i do ssed=${ssed}${i}"d;" echo "${ssed}" done < `echo ${list}` echo "${ssed}" echo "sed -i '"${ssed}"' """${1}"""" fi
小表弟皮卡丘 2015-08-14
  • 打赏
  • 举报
回复
对,if后要有空格
  • 打赏
  • 举报
回复
if和 [ 之间要有空格

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧