在 bash 如何将行字段移动到文本文件中的列

In bash how to move row field to column in a text file

我有一个包含此记录的 .txt 文件:

field_1        value01a value01b value01c
field_2        value02
field_3        value03a value03b value03c

field_1        value11
field_2        value12a value12b 
field_3        value13

field_1        value21
field_2        value22
field_3        value23

...

field_1        valuen1
field_2        valuen2
field_3        valuen3

我想这样转换它们:

field1                      field2            field3
value01a value01b value01c  valu02            value03a value03b value03c 
value11                     value12a value12b value13
value21                     value22           value23
...
valuen1                     valuen2           valuen3

我试过类似的东西:

awk '{for (i = 1; i <NR; i ++) FNR == i {print i, $ (i + 1)}}' filename

或喜欢

awk '
{ 
   for (i=1; i<=NF; i++)  {
     a[NR,i] = $i
   }
}
NF>p { p = NF }
END {    
    for(j=1; j<=p; j++) {
       str=a[1,j]
       for(i=2; i<=NR; i++){
            str=str" "a[i,j]
       }
       print str
    }
 }'

但我无法让它工作

我希望值被转置,并且与特定字段关联的每个值元组与其他值对齐

有什么建议吗?

提前致谢

您能否尝试在 GNU awk.

中使用显示的示例进行跟踪、编写和测试
awk '
{
  first=
  =""
  sub(/^ +/,"")
  if(!arr[first]++){
    ++indArr
    counter[indArr]=first
  }
  ++count[first]
  arr[first OFS count[first]]=[=10=]
}
END{
  for(j=1;j<=indArr;j++){
    printf("%s\t%s",counter[j],j==indArr?ORS:"\t")
  }
  for(i=1;i<=FNR;i++){
     for(j=1;j<=indArr;j++){
       if(arr[counter[j] OFS i]){
          printf("%s\t%s",arr[counter[j] OFS i],j==indArr?ORS:"\t")
       }
     }
  }
}' Input_file | column -t -s $'\t'

column 命令取自@anubhava 先生在这里的回答。

我已经下载了你更大的示例文件。这是我想出的:

awk -v OFS='\t' -v RS= '
((n = split([=10=], a, / {2,}| *\n/)) % 2) == 0 {
   # print header
   if (NR==1)
      for (i=1; i<=n; i+=2)
         printf "%s", a[i] (i < n-1 ? OFS : ORS)
   # print all records
   for (i=2; i<=n; i+=2)
      printf "%s", a[i] (i < n ? OFS : ORS)
}' reclamiTestFile.txt | column -t -s $'\t'

Code Demo