Unix awk脚本将列转换为行 [英] Unix awk scripting to convert columns to rows

查看:166
本文介绍了Unix awk脚本将列转换为行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在UNIX脚本中需要帮助将行转换为列.我的来源是文件系统.

Need help to convert rows to columns in unix scripting. My source is file system.

尝试以下脚本:

 `perl -nle '
    if($. == 1)
    { (@a)=/([\w - .]+)(?=,|\s*$)/g }
    else
    {
        (@b)=/([\w - .]+)(?=,|\s*$)/g;
        print "$a[0]|$b[0]|$b[1]|$b[2}|$a[$_]|$b[$_+3]" foreach (0..$#a)
    }
    ' ip.txt >op.txt

input data from file: 

src,FI,QMA,PCG,PCC,PREI,G T
PIM2016.csv,MMR.S T - RED,334,114,120,34,123,725

使用最新脚本输出:

SRC | PIM2016.csv | MMRPPS | RED | SRC | 334 SRC | PIM2016.csv | MMRPPS | RED | FI | 114 SDRC | PIM2016.csv | MMRPPS |红色| QMA | 120 SRC | PIM2016.csv | MMRPPS |红色| PCG | 34 SRC | PIM2016.csv | MMRPPS |红色| PCC | 123 SRC | PIM2016.csv | MMRPPS |红色| PREI | 725 SRC | PIM2016.csv | MMRPPS | RED | G T |

SRC|PIM2016.csv|MMRPPS|RED|SRC|334 SRC|PIM2016.csv|MMRPPS|RED|FI|114 SDRC|PIM2016.csv|MMRPPS|RED|QMA|120 SRC|PIM2016.csv|MMRPPS|RED|PCG|34 SRC|PIM2016.csv|MMRPPS|RED|PCC|123 SRC|PIM2016.csv|MMRPPS|RED|PREI|725 SRC|PIM2016.csv|MMRPPS|RED|G T|

必填输出:

SRC | PIM2016.csv | MMRPPS | S T -RED | FI | 334 SRC | PIM2016.csv | MMRPPS | S T -RED | QMA | 114 SRC | PIM2016.csv | MMRPPS | S T -RED | PCG | 120 SRC | PIM2016.csv | MMRPPS | S T -RED | PCC | 34 SRC | PIM2016.csv | MMRPPS | S T -RED | PREI | 123 SRC | PIM2016.csv | MMRPPS | S T -RED | G T | 725

SRC|PIM2016.csv|MMRPPS|S T -RED|FI|334 SRC|PIM2016.csv|MMRPPS|S T -RED|QMA|114 SRC|PIM2016.csv|MMRPPS|S T -RED|PCG|120 SRC|PIM2016.csv|MMRPPS|S T -RED|PCC|34 SRC|PIM2016.csv|MMRPPS|S T -RED|PREI|123 SRC|PIM2016.csv|MMRPPS|S T -RED|G T|725

推荐答案

$ cat ip.txt 
HDR :FI,QA,PC,PM,PRE,G T
Detail row: MMRPPS,ST - RED,334,114,120,34,123,725
            UP,UPR,0,0,0,0,0,0

假定行之间没有空行:

$ perl -nle '
s/^.*:\s*|^\s*|\s*$//;
if($. == 1)
{ (@a) = /[^,]+/g }
else
{
    (@b) = /[^,]+/g;
    print "$b[0] $a[$_] $b[1] $b[$_+2]" foreach (0..$#a);
}
' ip.txt
MMRPPS FI ST - RED 334
MMRPPS QA ST - RED 114
MMRPPS PC ST - RED 120
MMRPPS PM ST - RED 34
MMRPPS PRE ST - RED 123
MMRPPS G T ST - RED 725
UP FI UPR 0
UP QA UPR 0
UP PC UPR 0
UP PM UPR 0
UP PRE UPR 0
UP G T UPR 0

  • 对输入行进行预处理,以删除前导文本,直到:,任何前导和尾随空白
  • 从第一行将逗号分隔的值提取到@a数组中.正则表达式查找非,字符的字符串
  • 对于所有其他行,
    • 相同的正则表达式将逗号分隔的值提取到@b数组
    • 按所需顺序打印
      • Input lines are pre-processed to remove leading text upto :, any leading and trailing white-spaces
      • From first line, extract comma separated values into @a array. The regex looks for string of non , characters
      • For all other lines,
        • same regex to extract comma separated values into @b array
        • print in desired order
        • 这篇关于Unix awk脚本将列转换为行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆