【问题标题】:Combining first x number of characters in column 1 of csv to all of column 2将csv第1列中的前x个字符组合到第2列中的所有字符
【发布时间】:2021-02-09 23:37:39
【问题描述】:

我一直试图弄清楚如何为 CSV 中的每个实体创建一个“唯一”名称。如果我有以下情况: 输入.csv

CustomerName,ID
businessName1,123456
businessName2Could Be longer with spaces,23456
businessName3Could use - or other special chars,234567

我想要做的是删除完整的公司名称并创建一个“编码”(轻轻使用该术语)名称来隐藏完整的公司名称。

我一直在尝试找出一个多合一的解决方案。

潜在输出.csv

CodedName
bus123456
bus23456
bus234567

我可以轻松地使用 cut 来获取 CSV 中每行的前几个字母/字节。这解决了我的问题的第 1 部分。第二部分是添加ID。我知道如果我使用前 3 个字符,它们看起来都相似 - 但是有人可以在更大的数据仓库中搜索的 ID 可以获取其余信息。

将数据清理到上述内容是一些巫术 - 但使用以下命令到达那里。

我几乎可以肯定这可以使用 sed / awk 来完成 - 只是不太熟悉获得我需要的输出的所有标志。

以下是我是如何做到这一点的。

awk '{gsub(/\"/,"")};1' Custom.csv | awk '{gsub(/\(/,"")};1' | awk '{gsub(/\)/,"")};1'  > custom_RC.csv

sed '1,2 d' custom_RC.csv | sed '1 d' | awk '{gsub(/\(/,"")};1' | awk '{gsub(/\)/,"")};1' |  awk '{gsub(/\"/,"")};1' | cut -f 1,4 -d ,

【问题讨论】:

  • 你不需要用你的编码版本和全名创建一个地图文件吗?此外,减少对awk '{gsub(/\"/,"");gsub(/\(/,"");gsub(/\)/,"")}' Custom.csv > custom_RC.csv 等外部进程的调用(可能需要稍微清理一下。)(在这种情况下不需要;1)。并且可以减少到 1 或 2 个gsubs,使用(/srchTarg1|srchTarg2|..../,"",$0)。祝你好运。
  • sed 1,2 d | sed 1 d ,这不是和 sed 1,3 d 一样吗?但这可以用 awk 来完成,即awk -F, 'NR >=3 {next} {gsub(...)。打印 $1,$4}`。祝你好运。

标签: bash csv awk sed


【解决方案1】:

你可以试试这个awk:

awk -F, '{print (NR == 1 ? "CodedName" : substr($1, 1, 3) $2)}'  file.csv
CodedName
bus123456
bus23456
bus234567

【讨论】:

  • 也许用NR==1替换BEGIN
  • 我还需要清理一些数据,但这很有效,而且我一直在寻找。谢谢。
猜你喜欢
  • 2018-10-25
  • 1970-01-01
  • 1970-01-01
  • 2021-07-13
  • 2020-02-03
  • 1970-01-01
  • 2019-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多