【问题标题】:How to transpose Rows and columns in unix shell?如何在 unix shell 中转置行和列?
【发布时间】:2017-05-30 15:01:10
【问题描述】:

我想使用 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 ?

【问题讨论】:

  • INPUT.txt 中的列分隔符是什么?制表符还是空格?
  • 嗨,赛勒斯,它是一个空格

标签: linux shell unix awk sed


【解决方案1】:

这是一个对输入数据很脆弱的。 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

每个标题项都应包含与示例数据一样的 2 行数据。如果不是这样,请更新数据以更好地反映真实情况。

【讨论】:

  • 感谢先生的回复。
  • 您好,先生,我尝试实现您的代码,但在我的终端中无法识别“rs”。你能建议吗?
  • rs 进行转置,因此您需要它来解决此问题。您是否可以安装它并在将来从中受益? rs - reshape a data array 如果您使用 apt-cache 搜索它:apt-cache search rs | grep ^rs
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-26
  • 1970-01-01
  • 1970-01-01
  • 2021-08-11
相关资源
最近更新 更多