在Unix Shell脚本中将单个记录拆分为多个记录

时间:2019-05-17 18:47:31

标签: linux shell unix command-line

我有记录

示例:

EMP_ID|EMP_NAME|AGE|SALARAy
123456|XXXXXXXXX|30|10000000

有没有一种方法可以将记录拆分为多个记录。示例输出应类似于

EMP_ID|Attributes
123456|XXXXXXX
123456|30
123456|10000000

我想将同一条记录分成多个记录。在这里,员工ID是我的唯一列,我想循环运行其余3列并创建3条记录。像EMP_ID | EMP_NAME,EMP_ID | AGE,EMP_ID | SALARY一样。我可能还会有更多列,但对于示例,我提供了3列以及Employee ID。

任何建议请帮助我。

2 个答案:

答案 0 :(得分:0)

使用bash:

record='123456|XXXXXXXXX|30|10000000'
IFS='|' read -ra fields <<<"$record"
for ((i=1; i < "${#fields[@]}"; i++)); do 
    printf "%s|%s\n" "${fields[0]}" "${fields[i]}"
done
123456|XXXXXXXXX
123456|30
123456|10000000

对于整个文件:

{
    IFS= read -r header
    while IFS='|' read -ra fields; do
        for ((i=1; i < "${#fields[@]}"; i++)); do 
            printf "%s|%s\n" "${fields[0]}" "${fields[i]}"
        done
    done
} < filename

答案 1 :(得分:-1)

具有由特殊定界符分隔的字段(例如|)的行记录可以由基本的Unix命令行工具(例如awk)操纵。例如,将您的输入记录保存在文件records.txt中:

awk -F\| 'NR>1{for(i=2;i<=NF;i++){print $1"|"$(i)}}' records.txt

我建议阅读awk教程并试用它。值得学习的相关命令行工具包括grepsortwcuniqheadtailcut 。如果您定期对定界符分隔的文件进行数据处理,则每天可能会需要它们。一旦您的数据结构格式变得更加复杂(例如CSV格式,并且还可能在字段值中使用定界符),您就需要更具体的工具,例如,参见this question on CSV toolsjq来处理JSON。仍然了解基本的Unix命令行工具将为您节省大量时间。