Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash脚本:无法对刚刚在同一语句中创建的文件进行排序?_Bash_Unix - Fatal编程技术网

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 ...