连接第二列中第一列中匹配值的行并生成文件

时间:2018-11-09 17:02:50

标签: bash shell unix

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

源文件就像

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

预期的输出将是两个文件

  1. B1.txt(其中包含)

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

    DELTA1
    DELTA1
    

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

有什么建议吗?

3 个答案:

答案 0 :(得分:0)

您可以为此使用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命令的输出重定向到相应的文件,而不是打印到标准输出。

答案 1 :(得分:0)

这是一个带有awk的衬板:

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

尾部-n +3删除标题的前两行; awk脚本在以.txt

连接的第一个字段命名的文件中打印第三个字段的值

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

答案 2 :(得分:0)

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