【问题标题】:Awk: Remove text after last space in rowawk:删除行中最后一个空格后的文本
【发布时间】:2015-07-04 00:33:07
【问题描述】:

我有一个制表符分隔的文本文件,格式如下。

Col1  | Col2  | Col3
123.0 | 534.2 | Blah0 2031/23/12
23.00 | 786.2 | Blah1 2033/01/01
12.40 | 343.0 | Blah2 2031/27/11

我需要删除最后一列空格后的所有字符。所以我的输出是

Col1  | Col2  | Col3
123.0 | 534.2 | Blah0
23.00 | 786.2 | Blah1
12.40 | 343.0 | Blah2

我应该如何使用Awk 或类似的东西来解决这个问题?

【问题讨论】:

    标签: linux bash text awk text-processing


    【解决方案1】:

    使用 awk:

    awk -F '\t' 'BEGIN { OFS = FS } NR != 1 { sub(/ [^ ]*$/, "", $NF) } 1' filename
    

    即:

    BEGIN { OFS = FS }           # the output should be separated the same way as
                                 # the input
    
    NR != 1 {                    # in all lines except the header line:
      sub(/ [^ ]*$/, "", $NF)    # replace the last space and everything after it
    }                            # in the last field ($NF)  with the empty string
                                 # (i.e., remove it)
    
    1                            # in all lines: print.
    

    如果最后一个字段中有多个空格,并且您想删除第一个空格之后的所有内容,请改用sub(/ .*/, "", $NF)。在这种情况下应该发生什么问题并不完全清楚。

    【讨论】:

    • 请注意,此 awk 代码将从标题中删除 Col3
    • @Helio ` | ` 据我所知,它们周围的空格应该是制表符。但是我想我可以在带有标签的字段名称的答案中添加一些内容;没错,似乎不太可能在标题行上进行转换。
    • 更类似于 unix 的解决方案怎么样:(rev | cut -d ' ' -f 2-7 | rev) < file?
    • 这对我不太满意的数据做出了一些假设。可以使用-f 2- 而不是-f 2-7 来处理,但是如果有一行最后一个字段根本不包含空格怎么办?它是表格数据; awk 就是为此而生的。 (另外,我不同意 awk 不像 unix,因为它是 POSIX 的一部分:P)
    • 好吧,你有理由 :-((
    猜你喜欢
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-05
    • 1970-01-01
    • 2012-09-19
    相关资源
    最近更新 更多