【问题标题】:How can I get AWK to start reading by the end?我怎样才能让 AWK 在最后开始阅读?
【发布时间】:2019-06-02 09:44:45
【问题描述】:

我需要将所有文件解析为更好的格式,以生成以逗号分隔的列的结果,并考虑能够将内容导出为 CSV 文件。

这是我输入的一个例子;

.                                   D        0  Mon Dec 10 11:07:46 2018
..                                  D        0  Mon Feb 19 11:38:06 2018
RJ9-5                               D        0  Fri Nov 30 10:34:24 2018
WorkingOnClass                      D        0  Wed Feb 28 09:37:52 2018
ML-Test001                          D        0  Fri Dec  7 16:38:56 2018
TestML4Testing                      D        0  Wed Aug 22 08:58:42 2018
ML-NewDataSE SetCases1.xlsx         A  1415577  Wed Aug 29 14:00:16 2018
DR0001-Dum01                        D        0  Thu Aug 16 08:24:25 2018
DR0002-Dum02                        D        0  Thu Aug 16 09:04:50 2018
Readme File for Documentation And Data Description.docx      A    16136  Wed Aug 29 14:00:24 2018
ML Database Prototype               D        0  Thu Dec  6 15:11:11 2018
OneNote                             D        0  Mon Dec  3 09:39:20 2018
Data                                A        0  Mon Dec 10 11:07:46 2018

\RJ9-5
 .                                 D        0  Fri Nov 30 10:34:24 2018
 ..                                D        0  Mon Dec 10 11:07:46 2018
 KLR0151_Set023_Files_RJ9_05.xlsx  A   182462  Wed Apr  4 02:48:55 2018
 KLR0152_Set023_Files_RJ9_05.xlsx  A   525309  Wed Apr  4 02:53:57 2018

 \ML-Test001                          
 .                                   D        0  Wed Feb 28 09:37:52 2018
 ..                                  D        0  Mon Dec 10 11:07:46 2018
 WT_Conforming_Format1_1.docx        A   500914  Mon Feb 26 08:50:55 2018
 Conforming_Format_1_1.xlsx          A   130647  Mon Feb 26 08:52:33 2018
 DR0135_Dum01_text.xls               A   974848  Mon Feb 12 08:11:11 2018
 DR0139_Dum02_body.xls               A  1061888  Tue Jun 19 13:43:54 2018
 DataSet_File_mod0874953.xlsx        A   149835  Mon Feb 26 14:17:02 2018
 File Path For Dataset-2018.07.11.xlsx      A    34661  Mon Feb 12 09:27:17

这里的脚本可以完成这项工作:

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

但是忽略了上面有空格的名字,所以我需要用类似的东西来验证它们:

awk -v FS="\t" '{print $1}'

但我无法集成到 shell 脚本中,因为 shell 脚本的工作方式,所以我在考虑让 AWK 从最后开始阅读,因为结束总是相同的,剩下的就离开了。

输出应该是这样的:

/RJ9-5/KLR0151_Set023_Files_RJ9_05.xlsx,182462,Wed Apr  4 02:48:55 2018
/RJ9-5/KLR0152_Set023_Files_RJ9_05.xlsx,25309,Wed Apr  4 02:53:57 2018
/ML-Test001/WT_Conforming_Format1_1.docx,500914,Mon Feb 26 08:50:55 2018
/ML-Test001/Format_1_1.xlsx,130647,Mon Feb 26 08:52:33 2018
/ML-Test001/DR0135_Dum01_text.xls,974848,Mon Feb 12 08:11:11 2018
/ML-Test001/DR0139_Dum02_body.xls,1061888,Tue Jun 19 13:43:54 2018
/ML-Test001/DataSet_File_mod0874953.xlsx,149835,Mon Feb 26 14:17:02 2018
/ML-Test001/File Path For Dataset-2018.07.11.xlsx,34661,Mon Feb 12 09:27:17 2018

【问题讨论】:

  • 使用$NF$(NF-1)等......
  • 我猜你没有使用类似 unix 的操作系统,但this 仍然可能是个好建议。如果您仍然使用 bash,则使用“路径名扩展”(您可以在手册页中阅读)来收集文件名可能会更安全,然后使用您的操作系统版本的 stat 命令,无论如何就是这样。
  • 您的输入与您在脚本中所做的不匹配...请查看
  • edit 你的问题是在给定输入的情况下添加预期的输出。

标签: bash shell parsing awk


【解决方案1】:

试试这个 Perl 解决方案:

$ perl -lane ' if(/^\s*$/) { $x=0;$y=0} if(/^\\/) {$x=1 ;($a=$_)=~s/\s*$//g;$a=~s/\\/\//g; } $y++ if $x==1 ; if($y>3) { s/^\s*//g; $_=~s/(.+?)\s+\S+\s+((\d+)\s+.+)/$1 $2/g;print "$a/$_" } ' essparaq.txt
/RJ9-5/KLR0151_Set023_Files_RJ9_05.xlsx 182462  Wed Apr  4 02:48:55 2018
/RJ9-5/KLR0152_Set023_Files_RJ9_05.xlsx 525309  Wed Apr  4 02:53:57 2018
/ML-Test001/WT_Conforming_Format1_1.docx 500914  Mon Feb 26 08:50:55 2018
/ML-Test001/Conforming_Format_1_1.xlsx 130647  Mon Feb 26 08:52:33 2018
/ML-Test001/DR0135_Dum01_text.xls 974848  Mon Feb 12 08:11:11 2018
/ML-Test001/DR0139_Dum02_body.xls 1061888  Tue Jun 19 13:43:54 2018
/ML-Test001/DataSet_File_mod0874953.xlsx 149835  Mon Feb 26 14:17:02 2018
/ML-Test001/File Path For Dataset-2018.07.11.xlsx 34661  Mon Feb 12 09:27:17

$ cat essparaq.txt
.                                   D        0  Mon Dec 10 11:07:46 2018
..                                  D        0  Mon Feb 19 11:38:06 2018
RJ9-5                               D        0  Fri Nov 30 10:34:24 2018
WorkingOnClass                      D        0  Wed Feb 28 09:37:52 2018
ML-Test001                          D        0  Fri Dec  7 16:38:56 2018
TestML4Testing                      D        0  Wed Aug 22 08:58:42 2018
ML-NewDataSE SetCases1.xlsx         A  1415577  Wed Aug 29 14:00:16 2018
DR0001-Dum01                        D        0  Thu Aug 16 08:24:25 2018
DR0002-Dum02                        D        0  Thu Aug 16 09:04:50 2018
Readme File for Documentation And Data Description.docx      A    16136  Wed Aug 29 14    :00:24 2018
ML Database Prototype               D        0  Thu Dec  6 15:11:11 2018
OneNote                             D        0  Mon Dec  3 09:39:20 2018
Data                                A        0  Mon Dec 10 11:07:46 2018

\RJ9-5
 .                                 D        0  Fri Nov 30 10:34:24 2018
 ..                                D        0  Mon Dec 10 11:07:46 2018
 KLR0151_Set023_Files_RJ9_05.xlsx  A   182462  Wed Apr  4 02:48:55 2018
 KLR0152_Set023_Files_RJ9_05.xlsx  A   525309  Wed Apr  4 02:53:57 2018

\ML-Test001
 .                                   D        0  Wed Feb 28 09:37:52 2018
 ..                                  D        0  Mon Dec 10 11:07:46 2018
 WT_Conforming_Format1_1.docx        A   500914  Mon Feb 26 08:50:55 2018
 Conforming_Format_1_1.xlsx          A   130647  Mon Feb 26 08:52:33 2018
 DR0135_Dum01_text.xls               A   974848  Mon Feb 12 08:11:11 2018
 DR0139_Dum02_body.xls               A  1061888  Tue Jun 19 13:43:54 2018
 DataSet_File_mod0874953.xlsx        A   149835  Mon Feb 26 14:17:02 2018
 File Path For Dataset-2018.07.11.xlsx      A    34661  Mon Feb 12 09:27:17

【讨论】:

    【解决方案2】:

    使用 GNU awk 作为 match() 的第三个参数(更重要的是 \s[[:space:]] 的简写):

    $ cat tst.awk
    BEGIN { OFS="," }
    { gsub(/^\s+|\s+$/,"") }
    sub(/^\\/,"/") { path = $0; next }
    path == "" { next }
    match($0,/^(.*[^ ]) +A +([^ ]+) +(.*)/,a) { print path "/" a[1], a[2], a[3] }
    
    $ awk -f tst.awk file
    /RJ9-5/KLR0151_Set023_Files_RJ9_05.xlsx,182462,Wed Apr  4 02:48:55 2018
    /RJ9-5/KLR0152_Set023_Files_RJ9_05.xlsx,525309,Wed Apr  4 02:53:57 2018
    /ML-Test001/WT_Conforming_Format1_1.docx,500914,Mon Feb 26 08:50:55 2018
    /ML-Test001/Conforming_Format_1_1.xlsx,130647,Mon Feb 26 08:52:33 2018
    /ML-Test001/DR0135_Dum01_text.xls,974848,Mon Feb 12 08:11:11 2018
    /ML-Test001/DR0139_Dum02_body.xls,1061888,Tue Jun 19 13:43:54 2018
    /ML-Test001/DataSet_File_mod0874953.xlsx,149835,Mon Feb 26 14:17:02 2018
    /ML-Test001/File Path For Dataset-2018.07.11.xlsx,34661,Mon Feb 12 09:27:17
    

    【讨论】:

    • 有没有办法在开头避免输出中的第一个字符“/”?
    • 当然可以,但它看起来不像您在问题中所说的想要的输出。
    猜你喜欢
    • 1970-01-01
    • 2019-12-16
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 2023-03-12
    • 2023-02-20
    • 2023-03-14
    相关资源
    最近更新 更多