【问题标题】:bash print only last 7 fieldsbash 仅打印最后 7 个字段
【发布时间】:2022-10-23 18:12:34
【问题描述】:

我有数十万个文件,每个文件都有数十万行。

2022-09-19/SALES_1.csv:CUST1,US,2022-09-19,43.31,17.56,47.1,154.48,154. 114
2022-09-20/SALES_2.csv:CUST2,NA,2022-09-20,12.4,16.08,48.08,18.9,15.9,3517

这些行可能有不同数量的字段。无论存在多少字段,我都只想提取最后 7 个字段。

我正在尝试使用 cut & awk 但是,只能打印一系列字段,但不能打印最后一个“n”个字段。

请问我可以请求指导。

【问题讨论】:

  • 请使用您的 awk 尝试、代码生成的(错误)输出和(正确的)预期输出来更新问题
  • 所有文件都有逗号的字段分隔符吗?对于示例输入,是第一行最后一个字段中的错字:154. 114(嵌入空间)

标签: bash awk cut


【解决方案1】:
$  rev file | cut -d, -f1-7 | rev

无论每条记录中的字段数量如何,都会给出最后 7 个字段。

【讨论】:

    【解决方案2】:

    使用任何 POSIX awk:

    $ awk -F',' 'NF>7{sub("([^,]*,){"NF-7"}","")} 1' file
    US,2022-09-19,43.31,17.56,47.1,154.48,154. 114
    2022-09-20,12.4,16.08,48.08,18.9,15.9,3517
    

    【讨论】:

      【解决方案3】:
       1  {m,g}awk' BEGIN { _+=(_+=_^= FS = OFS = ",")+_
       2                   ___= "^[^"(__= "") ("]*")__
       3
       4  } NF<=_ || ($(NF-_) = __$(NF-_))^(sub(___,"")*!_)'
      
      US,
          2022-09-19,
          43.31,
          17.56,
          47.1,
          154.48,
          154. 114
      2022-09-20,
          12.4,
          16.08,
          48.08,
          18.9,
          15.9,
          3517
      

      【讨论】:

        【解决方案4】:

        在纯 Bash 中,没有任何外部进程和/或管道:

        (IFS=,; while read -ra line; do printf '%s
        ' "${line[*]: -7}"; done;) < file
        

        【讨论】:

          【解决方案5】:

          打印最后 7 个字段;字段不得包含,

          sed -E 's/.*,((.*,){6}.*)//'
          

          【讨论】:

            猜你喜欢
            • 2020-01-22
            • 1970-01-01
            • 2021-07-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-01-24
            • 2022-01-05
            相关资源
            最近更新 更多