Bash脚本:无法对刚刚在同一语句中创建的文件进行排序?
以下是我在脚本中使用的代码:Bash脚本:无法对刚刚在同一语句中创建的文件进行排序?,bash,unix,Bash,Unix,以下是我在脚本中使用的代码: cat log.txt | egrep-o“[0-9]{1,3}”>new.txt | sort new.txt | uniq>uniq.txt 我基本上是在一个文件中查找数字,并在一个新文件中列出所有这些数字,然后对新文件进行排序,然后创建一个只包含唯一数字的文件。这是一个学校项目,教授说所有4个命令都应该使用管道在一行代码中完成。代码确实有效,但不是第一次。我可以运行该脚本,它给出以下错误: 排序:无法读取:new.txt:没有这样的文件或目录 但它仍然会创建n
cat log.txt | egrep-o“[0-9]{1,3}”>new.txt | sort new.txt | uniq>uniq.txt
我基本上是在一个文件中查找数字,并在一个新文件中列出所有这些数字,然后对新文件进行排序,然后创建一个只包含唯一数字的文件。这是一个学校项目,教授说所有4个命令都应该使用管道在一行代码中完成。代码确实有效,但不是第一次。我可以运行该脚本,它给出以下错误:
排序:无法读取:new.txt:没有这样的文件或目录
但它仍然会创建new.txt和uniq.txt,因为我在使用ls时可以看到它们。如果我再次运行脚本,它现在就可以工作了。如果我删除文件并再次运行它,它将再次给出错误,直到我再次运行它。脚本的最后一部分应该删除那些导致我发现这个问题的文件
非常感谢您的帮助。您的语法不正确。使用类似的工具可以帮助您解决此类错误 也许这样的方法会奏效:
grep -Eo "[0-9]{1,3}" log.txt | sort | uniq > uniq.txt
编辑
要保留中间文件(“new.txt”),可以使用以下命令:
问题在于,您试图以两种不同(冲突)的方式将数据从
egrep
传递到sort
:使用管道和通过文件new.txt。您可以使用其中一个,但不能同时使用两个
以下是您正在使用的命令:
cat log.txt | egrep -o "[0-9]{1,3}" >new.txt | sort new.txt | uniq >uniq.txt
>new.txt
部分将egrep
的输出发送到文件new.txt,而不是通过管道(|
)发送到排序
。类似地,您告诉sort
从new.txt读取,而不是从其标准输入(管道来自egrep
)。这听起来似乎可行,但问题是在这样的管道中,所有命令都同时运行,而不是一次运行一个命令。显然,sort
试图在new.txt被创建之前读取它(除非您运行它两次,在这种情况下,sort
会第一次找到剩余的文件)
您可以将这些部分分开,以便它们按顺序运行:
cat log.txt | egrep -o "[0-9]{1,3}" >new.txt
sort new.txt | uniq >uniq.txt
这里有两条独立的管道,第二条管道在第一条管道完成之前不会运行,因此没有时间问题。但是你的教授一直想要管道,所以使用另一种解决方案:删除与new.txt相关的所有位(我不会给出完整的解决方案,因为这是家庭作业)
顺便说一句,这里实际上不需要cat
,因为egrep
可以直接从文件中读取,无论是命名还是输入重定向:
egrep -o "[0-9]{1,3}" log.txt ...
egrep -o "[0-9]{1,3}" <log.txt ...
egrep-o“[0-9]{1,3}”log.txt。。。
egrep-o“[0-9]{1,3}”是的,第二个文件起作用了(我确实需要稍后显示中间文件)。谢谢,我以后一定会用这个工具!更详细地说,|
和
都操纵标准输出的目的地,但您不能同时将其重定向到两个位置(没有像tee
这样的外部程序的帮助,它正好做到了这一点)。如果您将它们组合在一起,管道将不会收到任何输入。我认为您可以通过执行排序-u
来摆脱uniq
。感谢您的解释,我现在明白了为什么我所做的没有意义。我使用了另一个解决方案,因为它需要一行,我需要new.txt,因为我必须循环每个唯一的数字,然后显示每个数字发生的次数(使用new.txt)。我现在已经完成了这个项目,因为这是我需要解决的最后一件事。非常感谢。将标准输入传递到sort
中,同时传递一个文件作为参数进行排序,这有什么意义?你认为会发生什么?
egrep -o "[0-9]{1,3}" log.txt ...
egrep -o "[0-9]{1,3}" <log.txt ...