【问题标题】:Concatenate several awk command outputs in one command在一个命令中连接多个 awk 命令输出
【发布时间】:2019-05-12 20:18:14
【问题描述】:

**我有一个如下输入,包含很多很多行,我需要将所有这些文件解析为更好的格式,可以是 CSV 文件或 JSON(可能在将来)。 所以我需要产生一个用逗号分隔的列的结果,考虑现在能够导出 CSV 文件中的内容。

获取名称文件

awk '{ if($2 ~ /A/ ) print $1 }' dir_out

获取所有路径

awt ' /[\\]/ {print}'

获取文件的大小

awk '{ if($3 ~ /^[0-9]/) print $3}'

现在我有单独的命令来生成所需的结果,但是我必须找到一种方法将它们放在同一行 awk 命令或脚本中。

我无法解决的关键点之一是使结果的第 1 列成为分隔每个块的路径,用于块中的所有文件。

所以我从这个输入开始: **

\QJ DaJabase EltraJo\DR0151-populated\DaJa\ASAA Images\k0097\Qingl
 R0097A+05.00B-00-QingL.JPG          A  6958377  Fri Jun  8 12:53:30 2018
 R0097A+05.00B-00-QingLI.JPG         A  2794933  Fri Jun  8 12:53:30 2018
 R0097A+05.00B-00-QingLO.JPG         A  1350397  Fri Jun  8 12:53:30 2018
 R0097A+11.00B-00-QingL.JPG          A  6997803  Fri Jun  8 12:53:30 2018
 R0097A+11.00B-00-QingLI.JPG         A  2783151  Fri Jun  8 12:53:30 2018
 R0097A+11.00B-00-QingLO.JPG         A  1338662  Fri Jun  8 12:53:30 2018
 R0097A-00.00B-00-QingL.JPG          A  7069740  Fri Jun  8 12:53:30 2018
 R0097A-00.00B-00-QingLI.JPG         A  2825705  Fri Jun  8 12:53:30 2018
 R0097A-00.00B-00-QingLO.JPG         A  1369520  Fri Jun  8 12:53:30 2018
 Jhumbs.db                           A    20480  Fri Jun  8 13:14:41 2018
\QJ DaJabase EltraJo\DR0151-populated\DaJa\ASAA Images\k0098\Qingl
 R0098A+05.00B-00-QingL.JPG          A  6958377  Fri Jun  8 12:54:30 2018
 R0098A+05.00B-00-QingLI.JPG         A  2794933  Fri Jun  8 12:54:30 2018
 R0098A+05.00B-00-QingLO.JPG         A  1350398  Fri Jun  8 12:54:30 2018
 R0098A+11.00B-00-QingL.JPG          A  6998803  Fri Jun  8 12:54:30 2018
 R0098A+11.00B-00-QingLI.JPG         A  2783151  Fri Jun  8 12:54:30 2018
 R0098A+11.00B-00-QingLO.JPG         A  1338662  Fri Jun  8 12:54:30 2018
 R0098A-00.00B-00-QingL.JPG          A  7069840  Fri Jun  8 12:54:30 2018
 R0098A-00.00B-00-QingLI.JPG         A  2825705  Fri Jun  8 12:54:30 2018
 R0098A-00.00B-00-QingLO.JPG         A  1369520  Fri Jun  8 12:54:30 2018
 Jhumbs.db                           A    20480  Fri Jun  8 13:14:41 2018`

ljkhlj

     PATH, FILENAME, SIZE, TIMESTAMP
     \QJ DaJabase EltraJo\DR0151-populated\DaJa\ASAA Images\k0097\Qingl,    R0097A+05.00B-00-QingL.JPG, 6958377,  Fri Jun  8 12:53:30 2018
     \QJ DaJabase EltraJo\DR0151-populated\DaJa\ASAA Images\k0097\Qingl, R0097A+05.00B-00-QingLI.JPG, 2794933, Fri Jun  8 12:53:30 2018 
     \QJ DaJabase EltraJo\DR0151-populated\DaJa\ASAA Images\k0097\Qingl, R0097A+05.00B-00-QingLI.JPG, 1350397, Fri Jun  8 12:53:30 2018
     \QJ DaJabase EltraJo\DR0151-populated\DaJa\ASAA Images\k0097\Qingl,  R0097A+11.00B-00-QingL.JPG, 6997803, Fri Jun  8 12:53:30 2018
     \QJ DaJabase EltraJo\DR0151-populated\DaJa\ASAA Images\k0098\Qingl, R0098A+05.00B-00-QingL.JPG, 6958377, Fri Jun  8 12:54:30 2018
     \QJ DaJabase EltraJo\DR0151-populated\DaJa\ASAA Images\k0098\Qingl, R0098A+05.00B-00-QingLI.JPG, 6958377, Fri Jun  8 12:54:30 2018
     \QJ DaJabase EltraJo\DR0151-populated\DaJa\ASAA Images\k0098\Qingl, R0098A+05.00B-00-QingLO.JPG, 6958377, Fri Jun  8 12:54:30 2018
     \QJ DaJabase EltraJo\DR0151-populated\DaJa\ASAA Images\k0098\Qingl, R0098A+11.00B-00-QingL.JPG, 6958377, Fri Jun  8 12:54:30 2018

【问题讨论】:

    标签: parsing awk


    【解决方案1】:

    这是一种将 awk 命令组合到单个脚本中的方法:

    #!/bin/bash
    awk '
    $2 ~ /A/  {print $1; }  
    /[\\]/    {print}
    $3 ~ /^[0-9]/ {print $3}
    ' "$@"
    

    一般来说,awk 需要多个 /search/ {command} 对。如果 /search/ 缺失,则默认为所有行,如果 {command} 缺失,则默认为打印。

    这是获得预期结果所需的额外逻辑:

    #!/bin/bash
    awk -v OFS=, '
    BEGIN { print "PATH, FILENAME, SIZE, TIMESTAMP" }
    /[\\]/    { path=$0 }
    $2 ~ /A/  {print path,$1,$3,$4 " " $5 " " $6 " " $7 }  
    ' "$@"
    

    【讨论】:

    • 这会打印三行,而不是一行包含三个字段。
    • 另外,$* 应该是 "$@"
    • 确实,“$@”在文件名中的空格很常见的 Windows 框中更为重要。这也是进入 Linux 领域的正确方式。我已经对代码进行了更改。
    • 更新后的脚本将日期戳中的空格变平;如果固定宽度格式很重要,可以使用printf(或者可能正确地将日期解析为机器可读格式)。
    • 切线,\\ 并不真正需要在字符类中。
    【解决方案2】:
    $ cat tst.awk
    BEGIN {
        OFS = ", "
        print "PATH", "FILENAME", "SIZE", "TIMESTAMP"
    }
    /^ / {
        file = $1
        size = $3
        sub(/^ ([^[:space:]]+[[:space:]]+){3}/,"")
        print path, file, size, $0
        next
    }
    { path = $0 }
    
    $ awk -f tst.awk file
    PATH, FILENAME, SIZE, TIMESTAMP
    \QJ DaJabase EltraJo\DR0151-populated\DaJa\ASAA Images\k0097\Qingl, R0097A+05.00B-00-QingL.JPG, 6958377, Fri Jun  8 12:53:30 2018
    \QJ DaJabase EltraJo\DR0151-populated\DaJa\ASAA Images\k0097\Qingl, R0097A+05.00B-00-QingLI.JPG, 2794933, Fri Jun  8 12:53:30 2018
    \QJ DaJabase EltraJo\DR0151-populated\DaJa\ASAA Images\k0097\Qingl, R0097A+05.00B-00-QingLO.JPG, 1350397, Fri Jun  8 12:53:30 2018
    \QJ DaJabase EltraJo\DR0151-populated\DaJa\ASAA Images\k0097\Qingl, R0097A+11.00B-00-QingL.JPG, 6997803, Fri Jun  8 12:53:30 2018
    \QJ DaJabase EltraJo\DR0151-populated\DaJa\ASAA Images\k0097\Qingl, R0097A+11.00B-00-QingLI.JPG, 2783151, Fri Jun  8 12:53:30 2018
    \QJ DaJabase EltraJo\DR0151-populated\DaJa\ASAA Images\k0097\Qingl, R0097A+11.00B-00-QingLO.JPG, 1338662, Fri Jun  8 12:53:30 2018
    \QJ DaJabase EltraJo\DR0151-populated\DaJa\ASAA Images\k0097\Qingl, R0097A-00.00B-00-QingL.JPG, 7069740, Fri Jun  8 12:53:30 2018
    \QJ DaJabase EltraJo\DR0151-populated\DaJa\ASAA Images\k0097\Qingl, R0097A-00.00B-00-QingLI.JPG, 2825705, Fri Jun  8 12:53:30 2018
    \QJ DaJabase EltraJo\DR0151-populated\DaJa\ASAA Images\k0097\Qingl, R0097A-00.00B-00-QingLO.JPG, 1369520, Fri Jun  8 12:53:30 2018
    \QJ DaJabase EltraJo\DR0151-populated\DaJa\ASAA Images\k0097\Qingl, Jhumbs.db, 20480, Fri Jun  8 13:14:41 2018
    \QJ DaJabase EltraJo\DR0151-populated\DaJa\ASAA Images\k0098\Qingl, R0098A+05.00B-00-QingL.JPG, 6958377, Fri Jun  8 12:54:30 2018
    \QJ DaJabase EltraJo\DR0151-populated\DaJa\ASAA Images\k0098\Qingl, R0098A+05.00B-00-QingLI.JPG, 2794933, Fri Jun  8 12:54:30 2018
    \QJ DaJabase EltraJo\DR0151-populated\DaJa\ASAA Images\k0098\Qingl, R0098A+05.00B-00-QingLO.JPG, 1350398, Fri Jun  8 12:54:30 2018
    \QJ DaJabase EltraJo\DR0151-populated\DaJa\ASAA Images\k0098\Qingl, R0098A+11.00B-00-QingL.JPG, 6998803, Fri Jun  8 12:54:30 2018
    \QJ DaJabase EltraJo\DR0151-populated\DaJa\ASAA Images\k0098\Qingl, R0098A+11.00B-00-QingLI.JPG, 2783151, Fri Jun  8 12:54:30 2018
    \QJ DaJabase EltraJo\DR0151-populated\DaJa\ASAA Images\k0098\Qingl, R0098A+11.00B-00-QingLO.JPG, 1338662, Fri Jun  8 12:54:30 2018
    \QJ DaJabase EltraJo\DR0151-populated\DaJa\ASAA Images\k0098\Qingl, R0098A-00.00B-00-QingL.JPG, 7069840, Fri Jun  8 12:54:30 2018
    \QJ DaJabase EltraJo\DR0151-populated\DaJa\ASAA Images\k0098\Qingl, R0098A-00.00B-00-QingLI.JPG, 2825705, Fri Jun  8 12:54:30 2018
    \QJ DaJabase EltraJo\DR0151-populated\DaJa\ASAA Images\k0098\Qingl, R0098A-00.00B-00-QingLO.JPG, 1369520, Fri Jun  8 12:54:30 2018
    \QJ DaJabase EltraJo\DR0151-populated\DaJa\ASAA Images\k0098\Qingl, Jhumbs.db, 20480, Fri Jun  8 13:14:41 2018
    

    【讨论】:

    • 谢谢 Ed,还有一件事;如果其中一个图像名称上有空格,那将是正确的方法吗?我的一个想法是背单词,使用这个命令我可以得到带有空格的图像名称: awk -v FS='\t' '{print $1}' 但我不知道如何将它集成到你的方法中
    • 抱歉,我现在不打算重新讨论一个月前的问题了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-17
    • 1970-01-01
    相关资源
    最近更新 更多