【问题标题】:How to merge the 3rd column to multiple columns如何将第三列合并到多列
【发布时间】:2021-07-08 06:53:20
【问题描述】:

如何将第 3 列合并到 x,开始看起来像这样。

16 JUN  TRANSFER                                          blank          150       
        FROM ABC SOME COMPANY PTY LTD
18 JUN    VISA DEBIT PURCHASE CARD 1184                   14                blank    
          7-ELEVEN SYDNEY                                                      
          EFFECTIVE DATE 16 JUN 2020                                                                                                                                        
19 JUN    VISA DEBIT PURCHASE CARD 1184                 19.75               blank    
          DAISO SYDNEY                                                             
          DATE 17 JUN 2020  

最后以一行分隔 DATE、DETAILS、FEE、FEE

16 JUN, TRANSFER FROM ABC SOME COMPANY PTY LTD, BLANK, 150
18 JUN, VISA DEBIT PURCHASE CARD 1184, 7-ELEVEN SYDNEY, DATE 16 JUN 2020,14, blank
19 JUN, VISA DEBIT PURCHASE CARD 1184,DAISO SYDNEY, DATE 17 JUN 2020, 19.75, blank
                                                                             

【问题讨论】:

  • 请在您的问题中分享您尝试过的代码,这是非常鼓励的,谢谢。
  • 我没有任何好的例子,如何去做,寻找可能的解决方案。
  • 我的想法是使用 AWK 数组。您有许多交易。所有像“7-11”等的cmets(附加数据)都可能是缩进的。因此,如果您遇到未缩进的行,则它是一个新事务(增加 TAcounter)。如果不是,则将行作为 cmets 添加到数组中的当前事务索引。最后,处理数组。希望这可以帮助您尝试一些东西。
  • 这个输入的来源是什么?您是从 excel 表或其他来源复制此内容并将其粘贴到此处吗?我想了解您输入中存在的不可见特殊字符。您可以在 vim 编辑器中从源代码复制后粘贴您的输入并运行:set list,然后将其复制并添加到这里吗?
  • 我无法发布完整的来源,因为这是我的银行记录,我正在使用它来完成我的任务。

标签: linux awk sed


【解决方案1】:

这可能对你有用(GNU sed):

sed -E ':a;N;s/ {2,}|$/, /g
        /(,.*), (.*,.*, )\n(,.*)/{s//\1\3\2/;$!ba};s/, (\n|$)/\1/;P;D' file

将两个或多个空格或行尾替换为, ,即表单列。

添加下一行,如果它以逗号开头,则将其添加到第 3 列并重复。

否则,删除模式空间第一行末尾引入的, ,打印/删除第一行并重复。

【讨论】:

  • 我在 linux 上,我试过了,但出现错误:sed: -e expression #1, char 21: unknown option to `s'
【解决方案2】:

有一个很棒的页面:The Grymoire - AWK

如果数据在data.txt文件中,试试这个:

awk '
/^[0-9][0-9]*[[:blank:]]/ && NF > 3 {
  if (last_cols) {
    printf(", %s\n",last_cols);
  }
  printf("%s %s, ",$1, $2);
  last_cols=$(NF-1) " " $NR;
  for(i=3; i< NF-1; i++) {
    if (i>3) { 
      printf(" ");
    }
    printf("%s",$i);
  }
  next;
}
{ 
  if (NF>=1) {
    printf(", ");
  }
  for(i=1; i<= NF; i++) {
    printf(" %s",$i);
  }
}
END {
  printf(", %s\n",last_cols);
}' data.txt

生成的输出:

16 JUN,  TRANSFER,  FROM ABC SOME COMPANY PTY LTD, blank 16
18 JUN,  VISA DEBIT PURCHASE CARD 1184,  7-ELEVEN SYDNEY,  EFFECTIVE DATE 16 JUN 2020, 14 VISA
19 JUN,  VISA DEBIT PURCHASE CARD 1184,  DAISO SYDNEY,  DATE 17 JUN 2020, 19.75 CARD

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-10
    • 2010-12-08
    • 1970-01-01
    • 2019-05-18
    相关资源
    最近更新 更多