用AWK组织文件

用AWK组织文件,awk,dataset,transpose,organization,Awk,Dataset,Transpose,Organization,我有以下文件: Progeny Sire Dam Sex PENAS P35 P41 13254 11908 11421 M 47.275811 1322.828674 1719.183748 13323 11335 11386 M 43.29896 1225.57111 1634.436447 13562 11864 11895 M 47.884191 1228.568357 1615.4

我有以下文件:

Progeny Sire    Dam    Sex  PENAS       P35         P41
13254   11908   11421   M   47.275811   1322.828674 1719.183748
13323   11335   11386   M   43.29896    1225.57111  1634.436447
13562   11864   11895   M   47.884191   1228.568357 1615.427502
13338   11335   11970   M   45.780973   1196.32757  1561.900145
我需要将PENAS,P35和P41转换为列。这些列将成为新列:age。从视觉上看,我需要这样的文件:

Progeny Sire    Dam     Sex AGE     Peso
13254   11908   11421   M   PENAS   47.275811
13254   11908   11421   M   P35     1322.828674
13254   11908   11421   M   P41     1719.183748
13323   11335   11386   M   PENAS   43.29896
13323   11335   11386   M   P35     1225.57111
13323   11335   11386   M   P41     1634.436447
13562   11864   11895   M   PENAS   47.884191
13562   11864   11895   M   P35     1228.568357
13562   11864   11895   M   P41     1615.427502
13338   11335   11970   M   PENAS   45.780973
13338   11335   11970   M   P35     1196.32757
13338   11335   11970   M   P41     1561.900145
我尝试了此命令,但无效:

awk 'NR==1{h=$1 OFS $2 OFS $3 OFS $4 OFS $5 OFS $6 OFS $7; next}
            {a[$2]=(($1 in a)?(a[$1] OFS $NF):(OFS $5 OFS $6 OFS $7 OFS "AGE"));
             if(!($7 in b)) {h=h OFS $7; b[$7]}}
        END{print h; for(k in a) print k,a[k]}' a.txt | column -t > b
我被困在这一点上了,有什么建议吗?谢谢
注意,我原来的DAST有1400行。

我会这样做:

awk -v OFS='\t' -f transpose.awk infile
转置

NR==1{
NF-=2#删除最后两个标题列
$NF=“AGE”#添加年龄列标题
$(NF+1)=“比索”#添加比索列标题
打印#打印标题
下一行#跳到下一行
}
{

对于(i=5;i这里是另一个
awk
,不依赖于列数

$ awk 'NR==1{n=split($0,h); 
             for(i=1;i<=NF-3;i++) printf "%s", $i OFS; 
             printf "%s\n", "AGE" OFS "Peso"; next} 
            {split($0,p); 
             NF--; 
             for(i=1;i<=3;i++) 
               {$(NF-1)=h[NF-2+i]; 
                $NF=p[NF-2+i]; 
                print}}' file | column -t


Progeny  Sire   Dam    Sex  AGE    Peso
13254    11908  11421  M    PENAS  47.275811
13254    11908  11421  M    P35    1322.828674
13254    11908  11421  M    P41    1719.183748
13323    11335  11386  M    PENAS  43.29896
13323    11335  11386  M    P35    1225.57111
13323    11335  11386  M    P41    1634.436447
13562    11864  11895  M    PENAS  47.884191
13562    11864  11895  M    P35    1228.568357
13562    11864  11895  M    P41    1615.427502
13338    11335  11970  M    PENAS  45.780973
13338    11335  11970  M    P35    1196.32757
13338    11335  11970  M    P41    1561.900145
$awk'NR==1{n=split($0,h);

对于(i=1;i以下
awk
也可能有帮助

awk '
FNR==1{
  for(i=5;i<=NF;i++){
    a[++h]=$i};
  NF-=2;
  $NF="AGE Peso";
  print;
  next}
{
  for(j=5;j<=NF;j++){
    printf("%s %s %s %s %s %s\n",$1,$2,$3,$4,a[++k],$j);
    k=j==NF?k="":k}
}' Input_file | column -t
awk'
FNR==1{
对于(i=5;i和GNU awk for gensub():

$cat tst.awk
开始{numPfx=4}
{pfx=gensub(((\\S+\\S+{“numPfx”})。*”,“\\1”,1)}
NR==1{
分割(0美元,年龄)
打印pfx,“年龄”,“比索”
下一个
}
{

对于(i=numPfx+1;iDecrementing NF是POSIX中未定义的行为。一些AWK将从记录末尾删除字段,其他AWK将不执行任何操作,而其他AWK仍可以执行任何他们喜欢的操作(生成错误消息、核心转储等)但是,我用GNU awk、mawk、busybox awk和nawk对它进行了测试,没有任何问题,所以它是合理的可移植的。例如,在OSX上使用BSD awk时,它会失败。对于其他的,即使它在给定的上下文中做了您想要的事情,下一个版本也是如此awk可以做一些不同的事情,甚至当前版本也可以在其他上下文中做一些不同的事情(例如,可能添加$1=$1,然后突然原始字段重新出现,或者其他任何事情……)而且它仍然是兼容POSIX的,所以这是一场赌博。@EdMorton:我已经添加了一条关于这一点的说明。OSX不使用nawk吗?不,OSX使用BSD awk。Idk除了Solaris上可用的三种awk之一之外,还有什么系统使用nawk呢?尽管nawk这个名字考虑不周,但nawk非常古老,早于POSIX,所以它不支持某些POSIX功能(例如,像[[:space:]这样的字符类和/或像{3}这样的重间隔),因此最好避免使用。
awk '
FNR==1{
  for(i=5;i<=NF;i++){
    a[++h]=$i};
  NF-=2;
  $NF="AGE Peso";
  print;
  next}
{
  for(j=5;j<=NF;j++){
    printf("%s %s %s %s %s %s\n",$1,$2,$3,$4,a[++k],$j);
    k=j==NF?k="":k}
}' Input_file | column -t
$ cat tst.awk
BEGIN { numPfx=4 }
{ pfx = gensub("((\\S+\\s+){"numPfx"}).*","\\1",1) }
NR==1 {
    split($0,ages)
    print pfx, "AGE", "Peso"
    next
}
{
    for (i=numPfx+1; i<=NF; i++) {
        print pfx, ages[i], $i
    }
}

$ awk -f tst.awk file | column -t
Progeny  Sire   Dam    Sex  AGE    Peso
13254    11908  11421  M    PENAS  47.275811
13254    11908  11421  M    P35    1322.828674
13254    11908  11421  M    P41    1719.183748
13323    11335  11386  M    PENAS  43.29896
13323    11335  11386  M    P35    1225.57111
13323    11335  11386  M    P41    1634.436447
13562    11864  11895  M    PENAS  47.884191
13562    11864  11895  M    P35    1228.568357
13562    11864  11895  M    P41    1615.427502
13338    11335  11970  M    PENAS  45.780973
13338    11335  11970  M    P35    1196.32757
13338    11335  11970  M    P41    1561.900145