我们一直在努力让脚本在tcsh中运行(我知道大多数地方都说不应该使用它,但我认为我没有选择)。
脚本应该接收带有列的文件并删除相同的行,但添加其中有多少行。我们是tsch的新手,并且无法正确使用语法。对于不同的shell,似乎存在所有相似但仍然不同的语法,这是令人困惑的。
似乎某些东西没有被关闭,但我们已经尝试过if和while循环的任何类型的fi,endif,done和end的组合。删除if情况并不能解决问题,也不会删除while循环之外的内容。问题可能是我们如何使用阅读?
awk '{print $1,$3}' raw_data|
awk -v OFS=' -> ' '{$1=$1};1'| sort -k 3 > collapsed_output.txt
number=0
lastline=0
while ( read -r collapsed_output.txt )
do
line = $line
if ( line == lastline )
then
number=number+1
else if( number != 0 )
then sed -i 'ls/^/lastline + ["label =" number] \n/' numbered_data.txt
number=1
lastline = line
else
number = 1
lastline = line
fi
done
sed -i 'ls/^/lastline + ["label =" number] \n/' numbered_data.txt
sed -i '1s/^/digraph finite_state_machine {\n/' numbered_data.txt
sed -i '$ a\'"}" numbered_data.txt
答案 0 :(得分:0)
首先,您发布的代码有另一个错误:如果您尝试运行它,则错误消息将是“无效的空命令”。始终发布您使用的确切代码(它应该以shebang行开头)。并且复制粘贴错误信息 - 你应该复制粘贴的东西中的拼写错误(“不可预见的”)是不可原谅的。
如果你真的想使用tcsh(并且你可能不需要 - 一个Bourne / POSIX风格的shell在tcsh到处都可用,通常你甚至有ksh或bash),你需要使用tcsh功能,而不是功能。不要盲目地尝试,而是阅读手册。它不会解决您的所有问题,但它确实解释了如何编写while
循环。
tcsh中也存在sh的一个特性是-x
选项,用于在执行时打印一行线。这至少会揭示错误的位置 - 它就在成功解析并执行的行之后。
“无效的空命令。”是由第一个代码行引起的:你不能在管道之后放一个换行符(与sh不同)。你需要一个反斜杠表示行继续,或者把所有内容放在同一行。
你不能在csh中放置一个简单的赋值 - number=0
尝试调用一个名为number=0
的命令,line = $line
尝试调用一个名为line
的命令(一个也是sh的情况!)。分配可以写为@ VARIABLE = EXPRESSION
代表数字,set VARIABLE="VALUE"
代表字符串。
while
loop的语法是while (EXPRESSION) INSTRUCTIONS… wend
。没有do
或done
关键字。此外,括号中的内容需要是一个表达式;要使用return status of an instruction as the value of an expression,请将指令放在大括号中。
read
是一个Bourne命令,在tcsh中不存在。您可以通过阅读$<
variable获得相同的功能,但据我所知,您无法检测到文件的结尾(它与空行无法区分),这使得无法读取文件中的文件。环。从标准输入读取行的另一个选项是
foreach line ("`cat`")
…
end
但请注意,这会跳过空行并修改反斜杠。
你的循环中有一些奇怪的逻辑 - 我不明白它正在尝试做什么,而无效的sed命令(你的意思是1s
而不是ls
?)没有帮助。
我建议用sh编写这个脚本,因为你似乎更熟悉它。