【问题标题】:Awk to remove characters from start of string in specific columnawk 从特定列中的字符串开头删除字符
【发布时间】:2014-11-11 04:34:30
【问题描述】:

文字如下:

1.6M    2014-08-21 20:56        ./file1
1.6M    2014-08-22 10:59        ./file2
24K     2014-08-26 10:39        ../file3
0       2014-08-21 14:12        ./file4
0       2014-08-22 18:05        ../file5
1.5M    2014-08-22 04:15        ./file6
8.0K    2014-08-20 20:31        ../file7

我希望输出按时间排序:

8.0K    2014-08-20 20:31        ../file7
0       2014-08-21 14:12        ./file4
1.6M    2014-08-21 20:56        ./file1
1.5M    2014-08-22 04:15        ./file6
1.6M    2014-08-22 10:59        ./file2
0       2014-08-22 18:05        ../file5
24K     2014-08-26 10:39        ../file3

然后我希望删除前导 ./ 但不删除 ../ 并且只打印大小和文件名...

到目前为止,我得到了:

sort -k 2 | awk 'BEGIN{FS="\t"; OFS="\t"} {gsub(/.\//, ""); print}'

这给出了:

8.0K        .file7
0           file4
1.6M        file1
1.5M        file6
1.6M        file2
0           .file5
24K         .file3

如何使 gsub 仅适用于第 3 列的开始(前 2 个字符),以使 ../fileX 不会变为 .fileX

【问题讨论】:

    标签: awk gsub


    【解决方案1】:

    我想通了...非常接近 :),只需要稍微改变 gsub 命令

    已编辑

    {gsub(/^\.\//, "", $3)
    

    【讨论】:

    • 您还需要转义 . => /^\.\//。由于. 是“匹配任何字符”的正则表达式特殊字符,您的表达式将从字符串“a/b/c”中删除前 2 个字符
    【解决方案2】:

    很高兴你找到了一条出路。这是我使用 sed 的解决方案。

    sort -k 2 tt | sed -r 's| \.{1}/| |'
    

    例子:

    sdlcb@Goofy-Gen:~/AMD$ sort -k 2 tt | sed -r 's| \.{1}/| |'
    8.0K    2014-08-20 20:31        ../file7
    0       2014-08-21 14:12        file4
    1.6M    2014-08-21 20:56        file1
    1.5M    2014-08-22 04:15        file6
    1.6M    2014-08-22 10:59        file2
    0       2014-08-22 18:05        ../file5
    24K     2014-08-26 10:39        ../file3
    

    这里的想法是简单地删除前面有空格的“./”。即删除“./”,或者换句话说,用“”(空格)替换“./”。用空格替换只是为了保持缩进。 sed 命令中的 -r 用于正则表达式支持。 sed 's|a|b|'表示将“a”的第一次出现替换为“b”。因此,在我们的例子中,替换发生在 's| .{1}/| |。 “ .{1}/” 表示“单个空格后跟 1 '.'特点”。点字符需要转义,否则 sed 会将其解释为任何字符。

    【讨论】:

    • 不错!谢谢。你能解释一下 sed 命令吗,我不太确定我理解它吗?和tt 排序?
    • @Patrick: 'tt' 是包含您输入文本的文件的名称。如果您根本不熟悉 sed,我建议您对此进行一些研究。 grymoire.com/Unix/Sed.html 是一个很好的起点。我会用解释编辑我的答案...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-22
    • 2022-11-28
    • 1970-01-01
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    相关资源
    最近更新 更多