Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Awk 删除多个字段后如何删除标题剩余空格?_Awk_Tar - Fatal编程技术网

Awk 删除多个字段后如何删除标题剩余空格?

Awk 删除多个字段后如何删除标题剩余空格?,awk,tar,Awk,Tar,对不起,我会像我一样写,因为我总是被管道字符弄糊涂 我有一个tar文件,因此可以通过-t选项查看列表。每行代码如下所示 -rwxr-x--- admin/users 287110 2017-04-01 12:49 017_0401/345 alice.wav [5spaces]017_0401/345 alice.wav [tab] 287110 我们可以看到路径是017_0401/,文件名是345 alice.wav,它有空间 我需要的只是文件名和大小信息 对于awk,$3是大小,$6,

对不起,我会像我一样写,因为我总是被管道字符弄糊涂

我有一个tar文件,因此可以通过-t选项查看列表。每行代码如下所示

-rwxr-x--- admin/users  287110 2017-04-01 12:49 017_0401/345 alice.wav
[5spaces]017_0401/345 alice.wav [tab] 287110
我们可以看到路径是017_0401/,文件名是345 alice.wav,它有空间

我需要的只是文件名和大小信息

对于awk,$3是大小,$6,其余部分将是文件名

不幸的是,许多文件的名称中有数量不可预测的空格,而我没有命名

我想让awk把这个列表列在下面。文件名\t大小

017_0401/345 alice.wav [tab] 287110
所以,我试过这样的awk:

cat tarlist.txt | awk'{zsize=$3;$1=$2=$3=$4=$5=;print$0\tzsize;}' 雷姆:我不得不使用$0,因为许多文件的名称中都有空格。 但是结果会有如下的标题空间

-rwxr-x--- admin/users  287110 2017-04-01 12:49 017_0401/345 alice.wav
[5spaces]017_0401/345 alice.wav [tab] 287110
我需要的是

017_0401/345 alice.wav [tab] 287110
如何从5个已删除字段中删除剩余空格?
感谢您在此阅读。

使用GNU awk从$0中删除所有前导空格:

tar ... | awk '{size=$3; $1=$2=$3=$4=$5=""; gsub(/^ */, ""); print $0 "\t" size}'

使用GNU awk从$0中删除所有前导空格:

tar ... | awk '{size=$3; $1=$2=$3=$4=$5=""; gsub(/^ */, ""); print $0 "\t" size}'

稍有不同的看法。。。删除冒号之前的所有内容:及其后的三个字符:

tar tvf ... | gawk '{print gensub(/[^:]*:...(.*)/,"\\1\t"$3,1)}'
即使文件/目录名以空格开头,这仍然有效。对于那些刚加入awk的人来说,这意味着

捕获冒号后面的所有内容以及以下三个字符作为捕获组1。打印捕获组1,后跟选项卡和字段3。仅在第一次出现冒号时执行此操作

请注意,GESUB需要GNU awk。见埃德·莫顿的评论

如果您真的想对其进行编码,使其更简短、更神秘、更难以理解,您可以使用:

tar ... | gawk '{$0=gensub(/.*:...(.*)/,"\\1\t"$3,1)}1'

稍有不同的看法。。。删除冒号之前的所有内容:及其后的三个字符:

tar tvf ... | gawk '{print gensub(/[^:]*:...(.*)/,"\\1\t"$3,1)}'
即使文件/目录名以空格开头,这仍然有效。对于那些刚加入awk的人来说,这意味着

捕获冒号后面的所有内容以及以下三个字符作为捕获组1。打印捕获组1,后跟选项卡和字段3。仅在第一次出现冒号时执行此操作

请注意,GESUB需要GNU awk。见埃德·莫顿的评论

如果您真的想对其进行编码,使其更简短、更神秘、更难以理解,您可以使用:

tar ... | gawk '{$0=gensub(/.*:...(.*)/,"\\1\t"$3,1)}1'

这是一种对单个行的简单替换,是创建sed的目的。将GNU用于-E和\s/\s:

对于任何POSIX sed:

$ echo '-rwxr-x--- admin/users  287110 2017-04-01 12:49 017_0401/345 alice.wav' |
    sed 's/^\([^[:space:]]*[[:space:]]*\)\{2\}\([^[:space:]]*\)[[:space:]]*\([^[:space:]]*[[:space:]]*\)\{2\}\(.*\)/\4\t\2/'
017_0401/345 alice.wav  287110
如果您更喜欢awk,那么使用GNU awk表示\s/\s:

或使用任何POSIX awk:

$ echo '-rwxr-x--- admin/users  287110 2017-04-01 12:49 017_0401/345 alice.wav' |
    awk -v OFS='\t' '{size=$3; sub(/^([^[:space:]]+[[:space:]]+){5}/,""); print $0, size}'
017_0401/345 alice.wav  287110

只要您的文件名不能包含换行符,上述操作就可以正常工作。

这是一种对单个行的简单替换,而sed就是为了这样创建的。将GNU用于-E和\s/\s:

对于任何POSIX sed:

$ echo '-rwxr-x--- admin/users  287110 2017-04-01 12:49 017_0401/345 alice.wav' |
    sed 's/^\([^[:space:]]*[[:space:]]*\)\{2\}\([^[:space:]]*\)[[:space:]]*\([^[:space:]]*[[:space:]]*\)\{2\}\(.*\)/\4\t\2/'
017_0401/345 alice.wav  287110
如果您更喜欢awk,那么使用GNU awk表示\s/\s:

或使用任何POSIX awk:

$ echo '-rwxr-x--- admin/users  287110 2017-04-01 12:49 017_0401/345 alice.wav' |
    awk -v OFS='\t' '{size=$3; sub(/^([^[:space:]]+[[:space:]]+){5}/,""); print $0, size}'
017_0401/345 alice.wav  287110

只要您的文件名不能包含换行符,上述操作就可以使用。

这会将每个文件名中的制表符和/或多个连续空格更改为一个空白字符,OP特别警告我们,不幸的是,许多文件的名称中有不可预测的空格数,因此@埃德蒙顿:谢谢你,我还没有考虑过。我建议在本例中添加-F'{1}',这仍然会将名为foobar的文件更改为foobar。分配给字段没有可靠的方法。@EdMorton:谢谢,但我知道,插入符号“^”表示行的开头。所以@Cysus的主要答案让人感觉相当不错,因为它只会删除开头的空格,而不会处理文件名。我说得对吗?或者我是傻瓜?我不会说你是傻瓜,但你是不对的。^表示字符串的开头,而不是行的开头,但这与此无关,因为它将任何内容分配给一个字段,例如$5=导致awk将所有连续空白链替换为单个空白字符,如我在评论中所述。这将使每个文件名中的制表符和/或多个连续空白变为单个空白字符,OP特别警告我们,不幸的是,许多文件的名称中有不可预测的空格数,所以YMMV@埃德蒙顿:谢谢你,我还没有考虑过。我建议在本例中添加-F'{1}',这仍然会将名为foobar的文件更改为foobar。分配给字段没有可靠的方法。@EdMorton:谢谢,但我知道,插入符号“^”表示行的开头。所以@Cysus的主要答案让人感觉相当不错,因为它只会删除开头的空格,而不会处理文件名。我说得对吗?或者我是傻瓜?我不会说你是傻瓜,但你是不对的。^表示字符串的开头,而不是行的开头,但这与此处无关,因为它将任何内容分配给一个字段,例如$5=导致awk将所有连续空格链替换为单个空白字符,如我在评论中所述。我可以在您的oracle上再问一个问题吗我无法在LinuxDF命令中完成regex for separator。我敢再穿一件吗 你的神谕上还有什么我无法在LinuxDF命令中完成regex for separator。