【问题标题】:Split single record into Multiple records in Unix shell Script在 Unix shell 脚本中将单个记录拆分为多个记录
【发布时间】:2019-05-17 18:47:30
【问题描述】:

我有记录

例子:

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 列以及员工 ID。

如有任何建议,请帮助我。

【问题讨论】:

  • 我不知道你是否想要awk,但这应该可以awk -F'|' -vOFS='|' 'NR==1{print}NR>1{for(i=2;i<=NF;i++) print $1,$i}' record_file
  • @PS 非常感谢您的回复。我可以接受 anu 方法。让我按照你的建议试试 Awk。如果还有其他可用的方法,请告诉我。
  • @PS 在这个输出中,我将 EMP_ID 设置为 uniue 列。但是,如果我将 EMP_ID 和 EMP_NAME 作为唯一列和其他 2 列,我想循环运行并创建 2 条记录——我需要在命令中更新什么?\
  • @PS -- 我也可以为这种方法获取标题吗?
  • 您应该添加您的预期输出以获得更好的清晰度。

标签: linux shell unix command-line


【解决方案1】:

使用 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

【讨论】:

  • 谢谢格伦。有什么办法我也可以得到标题。我刚刚更新了上述描述中的预期输出...
  • while 循环之前,就在echo "EMP_ID|Attributes"
【解决方案2】:

字段由特殊分隔符(例如|)分隔的行记录可以通过基本的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 命令行工具仍然可以为您节省大量时间。

【讨论】:

  • 谢谢雅各布。让我过几分钟再回复。
  • 然后以列3 开始循环并打印$1 and $2`。这不是引导您完成整个用例的正确位置,但您应该大致了解哪些工具用于哪些任务。
  • @avinash 对不起,我不明白。关于 Stackoverflow 的两个一般性评论:请不要两次发布相同的评论。如果您喜欢某个答案,请点赞(您似乎投了反对票?)
  • @雅各布。我已经在 10 分钟之前将其标记为答案,我什至不知道如何投票。我只是点击了“打勾”标记并标记为答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-03
相关资源
最近更新 更多