Bash 使用awk读取和创建所有子目录中的文件
我正在尝试解析指定目录下所有子目录(和子目录)中名为“README”的所有文件,并在找到每个“README”文件的同一目录中创建一个包含解析输出的新文件Bash 使用awk读取和创建所有子目录中的文件,bash,shell,awk,scripting,subdirectory,Bash,Shell,Awk,Scripting,Subdirectory,我正在尝试解析指定目录下所有子目录(和子目录)中名为“README”的所有文件,并在找到每个“README”文件的同一目录中创建一个包含解析输出的新文件 #!/bin/bash FILES=$(find myDirectory -type f -name 'README') for f in $FILES do #this is fine echo "parsing $f" #this is not fine awk -F, 'BEGIN {print "header
#!/bin/bash
FILES=$(find myDirectory -type f -name 'README')
for f in $FILES
do
#this is fine
echo "parsing $f"
#this is not fine
awk -F, 'BEGIN {print "header"};
{print $2;}
END {print "footer";}' $f > outputfile
done
输出文件仅在我的工作目录中创建。我希望这样做是为了将输出文件重定向到相应自述文件所在的子目录中。还有比这更好的方法吗
如果有帮助,自述文件格式:
something,something2,something3
nothing1,nothing2,nothing3
鉴于您希望在找到自述文件的目录中创建输出文件,最简单的方法是使用POSIX标准 命令: 如果目录中有空格或换行符,则此代码是不安全的,但假设您坚持使用可移植文件名字符集(字母、数字、点、破折号和下划线),则不会出现重大问题。(在我做任何更改之前,它是不安全的;它仍然是不安全的。它是不安全的,因为你使用了
文件=$(查找…
,而当你这样做的时候,几乎可以保证名称中有空格、制表符、换行符时仍然是不安全的。有很多方法可以解决这个问题,但它们需要更多的大手术。)
如果需要,可以研究Bash机制,了解如何在不使用
dirname
的情况下执行此操作,“将awk
命令放置在for
循环中”以何种方式不起作用?回声给你什么?来自awk的错误消息是什么?每次输出文件都将位于当前目录中,因此您需要在创建文件后对其进行一些移动。除非你对自述文件怀有一种隐秘的仇恨,在这种情况下,有更简单的方法来破坏自述文件。@JonathanLeffler没有错误。outputfile并不是在子目录中创建的。echo为找到的每个自述实例提供“解析子目录名称自述”。是的,输出文件只在我的当前目录中创建。每个子目录中的自述文件都是不同的,所以我不认为移动它们是正确的方法。好吧,这就是你告诉脚本创建它的地方,所以它按照你的命令做了。如果你想做不同的事情,那也没关系;决定你想要什么,然后去做。你需要重新设计你的问题来解释你认为哪里出了问题,以及你想要实现什么。在自述文件的来源目录中创建输出文件是很简单的-您可以使用dirname
命令或研究shell参数扩展方法来处理问题。@JonathanLeffler好的,那好吧。我也不太确定该怎么做。也许我的问题应该是关于如何将文件重定向到找到某些文件的子目录。是的,这可能是您需要问的问题。谢谢。谢谢你的提示。我会调查的。
#!/bin/bash
FILES=$(find myDirectory -type f -name 'README')
for f in $FILES
do
outputfile="$(dirname "$f")/outputfile"
echo "parsing $f into $outputfile"
awk -F, 'BEGIN {print "header"}
{print $2}
END {print "footer"}' "$f" > "$outputfile"
done