awk从特定列中的字符串开头删除字符

时间:2014-11-11 04:34:30

标签: awk gsub

文字如下:

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仅适用于coloumn 3的开头(前2个字符),以便../fileX不会成为.fileX

2 个答案:

答案 0 :(得分:3)

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

<强>被修改

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

答案 1 :(得分: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

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