0

我可以知道有没有一种方法可以使用一个线性命令在 awk 中找到某些单词的同步,从而我找到的文件位于更深的层次上。想知道“find”cmd 是否可以在这里应用,但我尝试使用 find 它对我不起作用,可能我的用法是错误的。

我的命令如下,如果我将命令放在 *.abc 所在的同一级别,它会很漂亮。

awk '/hdl_file/{printf "%s",  $0}/input|output/{printf "%s",  $0}' *.abc | sed s/\.aux// | sed s/,//g | sed s/input// | sed s/output// | sed s/=// | sed s/\"//g | sed s/\.ac// | sed s/hdl_file// | awk '{print $NF $0}' | awk '{$NF="";print $0}'

但是,我需要应用此命令在更深的 2 个层次结构上查找 *.abc 文件。用 find 尝试了下面的命令,但它给出了错误。

find . -mindepth 2 | awk '/hdl_file/{printf "%s",  $0}/input|output/{printf "%s",  $0}' *.abc | sed s/\.aux// | sed s/,//g | sed s/input// | sed s/output// | sed s/=// | sed s/\"//g | sed s/\.ac// | sed s/hdl_file// | awk '{print $NF $0}' | awk '{$NF="";print $0}'

awk:不匹配。

请帮忙。谢谢。

4

2 回答 2

0

我不确定这是否是您的意图,但-mindepth会在低于 2 级以上find的目录中进行搜索。如果您想要最多2 级的文件,则需要使用.-maxdepth

如果你想使用一个命令的输出(在这种情况下find)作为另一个命令的参数(awk),你可以使用xargs,例如:

find . -maxdepth 2 | xargs awk '[your awk script goes here]'

或者,-exec如果您不关心文件的名称,您可以使用它来读取文件:

find . -maxdepth 2 -exec cat '{}' \; | awk '[your awk script goes here]'
# Or possibly:
find . -maxdepth 2 | xargs cat | awk '[your awk script goes here]'

另请注意,您可以避免生成多个 sed 实例并将它们连接在一起,这里有两种方法可以做到这一点:

sed -e 's/foo/bar/' -e 's/something/somethingelse/'
sed -f sed_script  # sed_script is a text file with commands for sed
于 2012-04-13T08:14:39.803 回答
0

你也可以使用

awk '....' */*/*.abc

如果文件正好是 2 个子目录深。对于任意深度,最近的 bash 可以做到

shopt -s globstar
awk '....' **/*.abc

您的 awks 和 seds 管道可以减少到

awk '
    /hdl_file/ || /input|output/ {
        gsub(/[,"]/, "")
        sub(/\.aux|\.ac|input|output|hdl_file|=/, "")
        last = $NF
        $NF = ""
        print last, $0
    }             
' *.abc 
于 2012-04-13T13:17:45.700 回答