如何提取文件中相同头行和头列对应的值?

如何提取文件中相同头行和头列对应的值?

我有以下文件

    1 2 3 4 5 
1   a b c d e
2   f g h i j
3   k l m n o
4   p k r s t
5   w x w z #

我想提取对应于位置 1,1 - 2,2 - 3,3- 4,4 和 5,5 的值

即想要的输出

1 2 3 4 5
a g m s # 

答案1

$ awk 'FNR == 1 { sub("^ *", ""); print; ORS=" "; next } { print $FNR } END { printf("\n") }' file
1 2 3 4 5
a g m s #

awk代码执行以下操作:

  1. 如果该行是第一行,则删除该行开头的空格并打印它。然后将输出记录分隔符 ( ORS) 更改为空格,并跳到下一行。
  2. 对于所有其他行,打印与行号对应的字段。由于 的值,数据将在打印时带有尾随空格,而不是换行符ORS
  3. 最后,输出一个换行符。

答案2

如果您的列或行未排序或依赖于关键字:

awk 'BEGIN {IFS=" +"} 
     NR==1 {for ( i=1 ; i<=NF ; i++ ) { ihead[$i]=i+1 }
     NR>1 { print $1,$ihead[$1] }' file

file
    5 2 1 4 3 
4   a b c d e
1   f g h i j
2   k l m n o
5   p k r s t
3   w x w z #

result
4 d
1 h
2 l
5 p
3 #

通过管道将其传送sort到排序输出。为了按照您的要求调整格式,可以将其通过管道传输datamash -t' ' transpose(预运行sort以进行排序输出)或采用更庞大的方式:

awk 'BEGIN {IFS=" +"} 
     NR==1 {for ( i=1 ; i<=NF ; i++ ) { ihead[$i]=i+1 ; head[$i]=$i }
     NR>1 { result[$1]=$ihead[$1] }
     END { for (a in head) printf head[a]" "
           printf "\n"
           for (a in head) printf result[a]" "}' file

在后一种 ( awk) 情况下,结果也会排序(按字母数字顺序按元素排序)):

1 2 3 4 5 
h l # d p 

答案3

由于文件中的列和行索引是连续的数字 - 您可以依赖自然偏移行索引 --> 到列索引

$ awk 'NR == 1{ sub(/^ +/, ""); print; next }
      { sep= NR!=NF? FS:ORS; printf "%s%s", $NR, sep }' file
1 2 3 4 5
a g m s #

答案4

或者,也许只是

awk 'NR==1{print};NR>1 {printf $NR" "}' file | column -t

输出

1  2  3  4  5
a  g  m  s  #

column -t -o" "如果你想要原来的单字符间距就这样做

相关内容