Unix awk脚本将列转换为行 [英] Unix awk scripting to convert columns to rows
问题描述
在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屋!
- same regex to extract comma separated values into
- 相同的正则表达式将逗号分隔的值提取到