File 查找文件名,然后将路径/文件名以及文件中的特定行打印到输出文件中
我马上就要解决这个问题了,但我似乎遇到了麻烦。我想搜索文件名,获取第14到17行的内容,然后将/path/filename打印到输出文件,然后将第14到17行的内容连接到同一行,用空格分隔 因此,在包含以下内容的目录中:File 查找文件名,然后将路径/文件名以及文件中的特定行打印到输出文件中,file,path,filenames,lines,File,Path,Filenames,Lines,我马上就要解决这个问题了,但我似乎遇到了麻烦。我想搜索文件名,获取第14到17行的内容,然后将/path/filename打印到输出文件,然后将第14到17行的内容连接到同一行,用空格分隔 因此,在包含以下内容的目录中: /path1/filenameX.txt line 14: 3 line 15: 4 line 16: 9 line 17: 5 及 我希望输出文件如下所示: ./path1/filenameX.txt 3 4 9 5 ./path2/filenameY.txt 56 10
/path1/filenameX.txt
line 14: 3
line 15: 4
line 16: 9
line 17: 5
及
我希望输出文件如下所示:
./path1/filenameX.txt 3 4 9 5
./path2/filenameY.txt 56 10 70 89
我一直在寻找这个问题的解决方案,到目前为止(主要是由于这个网站!)我已经解决了其中的各个部分,但要让它们一起工作是非常困难的
下面是一个不太有效的解决方案示例:
find . -name 'filename*' -print0 -exec cat {} \; | head -n 17 | tail -n 4 | tr '\n' ' ' > output.txt
当其他尝试获取输出文件中包含的filname而不是行的内容时,上面的这一次获取了中的行的内容,但不是文件名,而且最近的一次仅读取一个文件
sed、grep、awk、cat或其他任何组合都可以在命令行上工作,如果有任何帮助,我们将不胜感激 以下内容应分别适用于每个示例
awk 'BEGIN{printf "%s ", "."ARGV[1]} NR <=17 && NR >=14 {printf "%s",$3 } END{print x}' /path1/filenameX.txt`
awk'BEGIN{printf“%s”,“ARGV[1]}NR=14{printf“%s”,“$3}END{print x}'/path1/filenameX.txt`
还有Tiago的while循环
find . -name 'filename*' | while IFS= read -r line ; do awk 'BEGIN{printf "%s\t", ARGV[1]} NR <=17 && NR >=14 {printf "%s ", $3 } END{print x}' $line ; done
find-命名为“filename*”|而IFS=read-r行;doawk'BEGIN{printf“%s\t”,ARGV[1]}NR=14{printf“%s”,$3}END{print x}'$行;完成
试试这个:
root@dell:/tmp# find . -name 'filename*' | while IFS= read -r line; do echo -n "$line "; sed -nre '14,17p' $line | tr '\n' ' '; echo ; done
./path1/filenameX.txt 3 4 9 5
./path2/filenameY.txt 56 10 70 89
感谢您的回复,但我确实需要使用脚本在目录中搜索与“filename*”匹配的文件,而不是分别为每个文件运行单独的脚本,这主要是因为目录和子目录中有数百个文件。哦,我明白了……您可以使用Tiago的while循环和上面的awk one行文。我已经修改了答案。非常感谢!!最初,这给了我“sed:非法选项--r”。因此,我没有使用“sed-nre”,而是使用了“sed-ne”,它工作得非常好。再次感谢!
root@dell:/tmp# find . -name 'filename*' | while IFS= read -r line; do echo -n "$line "; sed -nre '14,17p' $line | tr '\n' ' '; echo ; done
./path1/filenameX.txt 3 4 9 5
./path2/filenameY.txt 56 10 70 89