【问题标题】:Finding a filename then printing the path/filename plus specific lines in the file to an output file查找文件名,然后将路径/文件名以及文件中的特定行打印到输出文件
【发布时间】:2014-05-19 15:08:45
【问题描述】:

我即将解决这个问题,但我似乎碰壁了。我想搜索文件名,获取第 14 到 17 行的内容,然后将 /path/filename 和第 14 到 17 行的内容打印到输出文件,连接到同一行,用空格分隔。

所以在一个目录中包含:

/path1/filenameX.txt
line 14: 3
line 15: 4
line 16: 9
line 17: 5

/path2/filenameY.txt
line 14: 56
line 15: 10
line 16: 70
line 17: 89

我希望输出文件如下所示:

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

当其他尝试获取包含在输出文件中的文件名而不是行的内容时,上面的这个得到了行的内容,而不是文件名,而且这个最新的只读取了一个文件。

sed、grep、awk、cat 或任何其他可以在命令行上工作的组合都可以,任何帮助都将不胜感激!

【问题讨论】:

    标签: file path filenames lines


    【解决方案1】:

    试试这个:

    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 
    

    【讨论】:

    • 非常感谢!!最初这给了我“sed:非法选项--r”。因此,我只输入了“sed -ne”而不是“sed -nre”,并且效果很好。再次感谢!
    【解决方案2】:

    以下内容应分别适用于每个示例

     awk 'BEGIN{printf "%s ", "."ARGV[1]} NR <=17 && 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 
    

    【讨论】:

    • 感谢您的回复,但我确实需要使用脚本在目录中搜索匹配 'filename*' 的文件,而不是分别为每个文件运行单独的脚本,主要是因为有数百个目录和子目录中的文件。
    • 哦,我明白了...好吧,您可以使用 Tiago 的 while 循环和上面的 awk 一个衬垫。我已经修改了答案。
    猜你喜欢
    • 1970-01-01
    • 2022-11-11
    • 2019-11-11
    • 1970-01-01
    • 2013-11-24
    • 2017-10-29
    • 1970-01-01
    • 2019-01-30
    • 1970-01-01
    相关资源
    最近更新 更多