【问题标题】:Conditional append of strings on fields in a csv file有条件地在 csv 文件中的字段上附加字符串
【发布时间】:2019-07-26 20:09:46
【问题描述】:

我正在尝试使用 bash 脚本转换如下所示的 csv 文件。标头和结构始终相同。

源 csv 文件:

name,title,department,score 
Jason,HR Manager,HR,10 
Alice,IT Director,Technology and Ops,8 
Jack,Network Team Lead,Technology and Ops,9

条件值(会根据要求而变化)

Real_name=name
Real_title=title
Real_department=department
Real_score=score

现在我试图在没有第一行的情况下获得以下结果,如果每个标题与这些条件值匹配,则值现在用空格分隔:

Real_name=Jason Real_title=HR Manager Real_department=HR Real_score=10
Real_name=Alice Real_title=IT Director Real_department=Technology and Ops Real_score=8
Real_name=Jack Real_title=Network Team Lead Real_department=Technology and Ops Real_score=9

我知道这可以用 awk 完成,但我的 awk 知识有限。我尝试了以下替换第一行但仍然不知道如何扩展它

awk "{$1="test "$1;print}' my_sample_file

更新:我似乎无法使用来自具有条件值的文件的输入。只是考虑一种更好且易于维护的方法,其中这些值不一定始终相同。可以是 MOD_title、MOD_name 等。而不是 Real_title、Real_name 等。

【问题讨论】:

  • 条件检查应该在哪里?在 CSV 的某一列中?外部条件检查(一个愚蠢的例子,如果今天是星期一,那么列名必须是 MOD_...
  • 我正在考虑使用带有条件值的 txt 文件。然后让 awk 直接读取它,然后打印出相同的输出。我认为这将需要几行代码,但仍然无法弄清楚。

标签: linux bash csv awk


【解决方案1】:

嗯,你并没有错过那么多:)

awk -F',' 'NR>1{printf "Real_name=%s Real_title=%s Real_department=%s Real_score=%s\n",$1,$2,$3,$4}' my_sample_file 
Real_name=Jason Real_title=HR Manager Real_department=HR Real_score=10 
Real_name=Alice Real_title=IT Director Real_department=Technology and Ops Real_score=8 
Real_name=Jack Real_title=Network Team Lead Real_department=Technology and Ops Real_score=9

【讨论】:

  • 为了使更改条件值更简洁更容易,我正在考虑将它们放在一个单独的位置(同一目录中的文件或同一脚本中的子部分),awk 可以读取和实现同一个目标。想法?
  • 接受了这个答案,因为它帮助我在编辑之前找出问题所在。谢谢@tink
【解决方案2】:

与米勒(https://github.com/johnkerl/miller)非常干净和容易

mlr --icsv --ofs " " rename -r '(.*),Real_\1' input.txt

拥有

Real_name=Jason Real_title=HR Manager Real_department=HR Real_score=10
Real_name=Alice Real_title=IT Director Real_department=Technology and Ops Real_score=8
Real_name=Jack Real_title=Network Team Lead Real_department=Technology and Ops Real_score=9

【讨论】:

  • 谢谢。我会试一试。看起来很干净很短。
  • 嗨@Mikado09如果您有任何问题请告诉我
  • 唯一的问题是我似乎无法使其与来自具有条件值的文件的输入一起工作。只是考虑一种更好且易于维护的方法,其中这些值不一定相同。可以是 MOD_title、MOD_name 等。而不是 Real_title、Real_name 等。
  • @Mikado09 请编辑您的问题,添加有关条件值的注释,并带有输入文件 ant 输出文件示例,我认为可以调整我的答案。
【解决方案3】:
$ cat tst.awk
BEGIN { FS="," }
NR==1 {
    for (i=1; i<=NF; i++) {
        h[i] = $i
    }
    next
}
{
    for (i=1; i<=NF; i++) {
        printf "Real_%s=%s%s", h[i], $i, (i<NF ? OFS : ORS)
    }
}

$ awk -f tst.awk file
Real_name=Jason Real_title=HR Manager Real_department=HR Real_score=10
Real_name=Alice Real_title=IT Director Real_department=Technology and Ops Real_score=8
Real_name=Jack Real_title=Network Team Lead Real_department=Technology and Ops Real_score=9

【讨论】:

  • 工作但当条件值不再是“Real_*”时,我正在考虑将它们放在一个单独的位置(同一目录中的文件或同一脚本中的子部分),awk 可以读取并达到相同的目标。只是为了更容易更新。想法?
  • 它只是一个软件,所以无论你想怎么做都可以。接受此问题的答案,如果您需要帮助,请提出新问题。
  • 这很令人失望,因为我们中的一些人努力回答了您提出的问题,因此接受其中一个答案并提出新问题将是一种感谢那些这样做并会给您的人的方式获得新问题答案的更好机会。 Chameleon questions 通常不受欢迎。
  • 酷。感谢您的反馈。
  • 谢谢埃德。我再看看
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-02
  • 2011-12-27
  • 1970-01-01
  • 2020-12-12
  • 1970-01-01
  • 2018-02-22
  • 1970-01-01
相关资源
最近更新 更多