使 awk 保持结束空白
Make awk keep ending whitespace
我有一个包含两列的文件列表。我需要删除第一列并保留文件名列表。如果我碰巧有一个以 space 结尾的文件,例如 "some file ",awk 会删除 space。
示例文件 "input"(注意 "some file " 末尾的 space)
abc some file
def some other file
运行
cat input | awk '{=""; print substr([=11=], 2)}' > output
将产生文件输出
some file
some other file
其中 "some file " 现在是 "some file",导致处理文件列表时文件不存在。
感谢任何便携式解决方案:)
[编辑] 试图简化上面的示例以使其更清楚,但实际上有更多的列,因此某些解决方案可能不适用。
实际文件是 rsync --list-only 输出:
drwxr-xr-x 4096 2017/06/04 11:24:21 .
drwxr-xr-x 234234 2017/06/04 11:24:19 some file
drwxr-xr-x 1341212 2017/06/04 11:24:19 some other file
显示文件大小的列可能会扩展,因此删除固定数量的尾随字符会导致错误。
文件名确实可以包含路径和多个space。
示例测试文件(请记住,文件大小可能会有所不同,因此第二列的大小可能会增加):
drwxr-xr-x 4096 2017/06/04 11:24:21 .
drwxr-xr-x 4096 2017/06/04 11:24:19 another
drwxr-xr-x 4096 2017/06/04 11:24:19 another/one
drwxr-xr-x 4096 2017/06/04 11:24:19 another/one/bites
drwxr-xr-x 4096 2017/06/04 11:24:19 another/one/bites/ de_dust
-rw-r--r-- 0 2017/06/04 11:24:19 another/one/bites/ de_dust/ 2017/06/04 11:24:19 Iron Rhapsody
drwxr-xr-x 4096 2017/06/04 11:24:19 phantom of
drwxr-xr-x 4096 2017/06/04 11:24:19 phantom of /the opera
-rw-r--r-- 0 2017/06/04 11:24:19 phantom of /the opera/Bohemian Maiden
[/编辑]
我建议使用 GNU sed:
sed -r 's/^.* [0-9/]{10} [0-9:]{8} //' input
输出:
.
some file
some other file
tr
和 cut
的解决方案:
tr -s ' ' <inputfile | cut -d' ' -f5-
$ awk '{sub(/[^/]+\/.{15}/,"")}1' file
.
another
another/one
another/one/bites
another/one/bites/ de_dust
another/one/bites/ de_dust/ 2017/06/04 11:24:19 Iron Rhapsody
phantom of
phantom of /the opera
phantom of /the opera/Bohemian Maiden
或使用 GNU 或 OSX sed for -E
(使用严格的 POSIX seds,您将转义 +、{ 和 }):
$ sed -E 's:[^/]+/.{15}::' file
.
another
another/one
another/one/bites
another/one/bites/ de_dust
another/one/bites/ de_dust/ 2017/06/04 11:24:19 Iron Rhapsody
phantom of
phantom of /the opera
phantom of /the opera/Bohemian Maiden
我有一个包含两列的文件列表。我需要删除第一列并保留文件名列表。如果我碰巧有一个以 space 结尾的文件,例如 "some file ",awk 会删除 space。
示例文件 "input"(注意 "some file " 末尾的 space)
abc some file
def some other file
运行
cat input | awk '{=""; print substr([=11=], 2)}' > output
将产生文件输出
some file
some other file
其中 "some file " 现在是 "some file",导致处理文件列表时文件不存在。
感谢任何便携式解决方案:)
[编辑] 试图简化上面的示例以使其更清楚,但实际上有更多的列,因此某些解决方案可能不适用。
实际文件是 rsync --list-only 输出:
drwxr-xr-x 4096 2017/06/04 11:24:21 .
drwxr-xr-x 234234 2017/06/04 11:24:19 some file
drwxr-xr-x 1341212 2017/06/04 11:24:19 some other file
显示文件大小的列可能会扩展,因此删除固定数量的尾随字符会导致错误。
文件名确实可以包含路径和多个space。
示例测试文件(请记住,文件大小可能会有所不同,因此第二列的大小可能会增加):
drwxr-xr-x 4096 2017/06/04 11:24:21 .
drwxr-xr-x 4096 2017/06/04 11:24:19 another
drwxr-xr-x 4096 2017/06/04 11:24:19 another/one
drwxr-xr-x 4096 2017/06/04 11:24:19 another/one/bites
drwxr-xr-x 4096 2017/06/04 11:24:19 another/one/bites/ de_dust
-rw-r--r-- 0 2017/06/04 11:24:19 another/one/bites/ de_dust/ 2017/06/04 11:24:19 Iron Rhapsody
drwxr-xr-x 4096 2017/06/04 11:24:19 phantom of
drwxr-xr-x 4096 2017/06/04 11:24:19 phantom of /the opera
-rw-r--r-- 0 2017/06/04 11:24:19 phantom of /the opera/Bohemian Maiden
[/编辑]
我建议使用 GNU sed:
sed -r 's/^.* [0-9/]{10} [0-9:]{8} //' input
输出:
. some file some other file
tr
和 cut
的解决方案:
tr -s ' ' <inputfile | cut -d' ' -f5-
$ awk '{sub(/[^/]+\/.{15}/,"")}1' file
.
another
another/one
another/one/bites
another/one/bites/ de_dust
another/one/bites/ de_dust/ 2017/06/04 11:24:19 Iron Rhapsody
phantom of
phantom of /the opera
phantom of /the opera/Bohemian Maiden
或使用 GNU 或 OSX sed for -E
(使用严格的 POSIX seds,您将转义 +、{ 和 }):
$ sed -E 's:[^/]+/.{15}::' file
.
another
another/one
another/one/bites
another/one/bites/ de_dust
another/one/bites/ de_dust/ 2017/06/04 11:24:19 Iron Rhapsody
phantom of
phantom of /the opera
phantom of /the opera/Bohemian Maiden