gpt4 book ai didi

linux - 如何在 unix shell 中转置行和列?

转载 作者:太空宇宙 更新时间:2023-11-04 10:20:17 28 4
gpt4 key购买 nike

我想使用 unix 脚本转置文本文件的行和列。任何人都可以建议解决方法吗?

输入文件:INPUT.txt

DM_AG_POSN_FDIC_BASE    22-MAY-2017 02:56:00    03:15:46    00:19:46 
DM_AG_POSN_FDIC_BASE 23-MAY-2017 03:26:47 03:45:33 00:18:46
DM_EC_CONS_POSN_BASE_HELPER 22-MAY-2017 03:06:43 03:08:38 00:01:55
DM_EC_POSN_B3_ENRICHED 22-MAY-2017 03:08:43 03:23:14 00:14:31
DM_EC_POSN_B3_PRORATED 22-MAY-2017 03:23:27 03:30:07 00:06:40
DM_EC_CONS_POSN_BASE_HELPER 23-MAY-2017 03:36:21 03:38:10 00:01:49
DM_EC_POSN_B3_ENRICHED 23-MAY-2017 03:38:23 04:00:08 00:21:44
DM_EC_POSN_B3_PRORATED 23-MAY-2017 04:00:08 04:06:30 00:06:21

所需的输出文件是:

DM_AG_POSN_FDIC_BASE                    DM_EC_CONS_POSN_BASE_HELPER               DM_EC_POSN_B3_ENRICHED                   DM_EC_POSN_B3_PRORATED

22-MAY-2017 02:56:00 03:15:46 00:19:46 22-MAY-2017 03:06:43 03:08:38 00:01:55 22-MAY-2017 03:08:43 03:23:14 00:14:31 22-MAY-2017 03:23:27 03:30:07 00:06:40
23-MAY-2017 03:26:47 03:45:33 00:18:46 23-MAY-2017 03:36:21 03:38:10 00:01:49 23-MAY-2017 03:38:23 04:00:08 00:21:44 23-MAY-2017 04:00:08 04:06:30 00:06:21

注意:INPUT.txt 文件的行数不固定,但第一列名称始终固定。

感谢您的建议/解决方法!

已实现由该组的一位活跃成员建议的代码。

sed 's/  \+/|/g;s/ $//' file |
awk -F '|' '{x=$1;$1="";a[x]=a[x]"|" substr($0, 2)} END{for(i in a) print i a[i]}' |
awk -F '|' '{for (i=1; i<=NF; i++) a[i,NR]=$i; max=(max<NF?NF:max)} END {for (i=1; i<=max; i++) {for (j=1; j<=NR; j++) printf "%s%s", a[i,j], (j<NR?"|":ORS) }}' |
column -t -s '|'

我得到的输出如下:

DM_AG_POSN_FDIC_BASE
22-MAY-2017 02:56:00
-BLANK- --> There is no output from 2nd line onwards(tried for only one record). Could you please check this ?

最佳答案

这是一个对输入数据很脆弱的方法。 sort 对记录进行分组,Awk 将 $1 和记录的其余部分拆分成不同的行,rs 用于将其转置为 3 行,输出漂亮:

$ awk '{if(p!=$1)print $1;p=$1;sub(p,"",$0);$1=$1}1' <(sort file) | rs -e -t 3
DM_AG_POSN_FDIC_BASE DM_EC_CONS_POSN_BASE_HELPER DM_EC_POSN_B3_ENRICHED DM_EC_POSN_B3_PRORATED
22-MAY-2017 02:56:00 03:15:46 00:19:46 22-MAY-2017 03:06:43 03:08:38 00:01:55 22-MAY-2017 03:08:43 03:23:14 00:14:31 22-MAY-2017 03:23:27 03:30:07 00:06:40
23-MAY-2017 03:26:47 03:45:33 00:18:46 23-MAY-2017 03:36:21 03:38:10 00:01:49 23-MAY-2017 03:38:23 04:00:08 00:21:44 23-MAY-2017 04:00:08 04:06:30 00:06:21

每个 header 项都应该像示例数据中一样恰好有 2 行数据。如果不是这种情况,请更新数据以更好地反射(reflect)真实情况。

关于linux - 如何在 unix shell 中转置行和列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44195794/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com