我有以下文件
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
代码执行以下操作:
- 如果该行是第一行,则删除该行开头的空格并打印它。然后将输出记录分隔符 (
ORS
) 更改为空格,并跳到下一行。 - 对于所有其他行,打印与行号对应的字段。由于 的值,数据将在打印时带有尾随空格,而不是换行符
ORS
。 - 最后,输出一个换行符。
答案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" "
如果你想要原来的单字符间距就这样做