【问题标题】:Concatenate second column rows for the matching values in First column and generate file连接第一列中匹配值的第二列行并生成文件
【发布时间】:2018-11-10 05:27:03
【问题描述】:

我需要根据第一列值生成文件(单个文件)。

源文件是这样的

Batch No ; Values 
-------------------
B1       ; TEST1
B1       ; TEST2
B1       ; TEST3
B2       ; DELTA1
B2       ; DELTA2

预期输出将是两个文件

  1. B1.txt(本包含)

    TEST1
    TEST2
    TEST3
    
  2. B2.txt(包含)

    DELTA1
    DELTA1
    

源文件数据每次都会变化,但结构(列数和分隔符)会保持一致

有什么建议吗?

【问题讨论】:

  • 你试过什么?它是如何失败的?

标签: bash shell unix


【解决方案1】:

这是一个带有 awk 的单行代码:

tail -n +3 test.txt | awk '{print $3>$1".txt"}'

尾部-n +3 去掉了头部的前2行; awk 脚本打印文件中第三个字段的值,该文件以与.txt 连接的第一个字段命名

默认的 awk 字段分隔符是空格,因此在您的示例中,; 是我们删除的字段 #2。输入文件甚至不必按第一个字段排序即可。

【讨论】:

  • awk 'NR>2{print $3>$1".txt"}' test.txt
【解决方案2】:

您可以为此使用 awk。

awk -F" *; *" 'NR > 2{print $2 > $1 ".txt"}' source.txt

这假设您的源文件是 source.txt 并包含

Batch No ; Values 
-------------------
B1       ; TEST1
B1       ; TEST2
B1       ; TEST3
B2       ; DELTA1
B2       ; DELTA2

结果是两个文件:B1.txtB2.txt

  • -F" *; *":定义字段分隔符。在这种情况下,分号和分号前后的任意数量的空格。
  • NR > 2:你跳过前两行。
  • $1$2分别存储第一列和第二列的内容。
  • 使用>,您可以将print 命令的输出重定向到相应的文件,而不是打印到标准输出。

【讨论】:

    【解决方案3】:
    #!/bin/bash
    while read -r file data; do
        echo "${data#; *}" >> "$file".txt
    done < <(sed -n -e '1,/^---/!p' source_file)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-16
      • 1970-01-01
      • 1970-01-01
      • 2020-05-13
      • 1970-01-01
      • 1970-01-01
      • 2021-08-18
      相关资源
      最近更新 更多