如何在Linux中将行转换为列

时间:2019-06-28 10:32:14

标签: linux shell

我想将行转换为linux中的列

我尝试了一些grep命令,但没有成功。

说我的输出文件看起来像

cat file1.txt

Slno : 1
Name : Google
Age : 20
Gender : Male
Exp : 10
Date : 10.10.19

Slno : 2
Name : Yahoo
Age : 21
Gender : Female
Exp : 11
Date : 11.11.19

我希望输出为

Slno    Name      Age    Gender     Exp        Date

1       Google    20     Male       10        10.10.19

2       Yahoo     21     Female     11        11.11.19

3 个答案:

答案 0 :(得分:1)

使用sed的解决方案如下。

 ( echo -e 'Slno\nName\nAge\nGender\nExp\nDate'; sed '/^\s*$/d;s/^.*:\s*//g' file1.txt ) | tr '\n' '\0' | xargs -0 -n 6 printf "%s\t%-20s%s\t%s\t%s\t%s\n\n"

执行流程:
首先,使用子外壳回显头,然后sed读取文件,并删除所有空行以及列名,从而在每个行的基础上将头放在顶部,然后仅是数据。
来自子外壳的空终止行将传递到xargs。读入一组6个args(列数),然后传递到printf

您可以根据可能的字段宽度调整格式字符串。

答案 1 :(得分:0)

在Perl中快速而又肮脏的硬编码hack:

import 'bootstrap/dist/css/bootstrap.css'

答案 2 :(得分:0)

要使用gawk将行转换为列,可以将值放入关联数组中。假设您的数据在file.txt

$ cat file.txt 
Slno : 1
Name : Google
Age : 20
Gender : Male
Exp : 10
Date : 10.10.19

Slno : 2
Name : Yahoo
Age : 21
Gender : Female
Exp : 11
Date : 11.11.19

您可以将记录视为由空行分隔(NF> 2),并将列$1$3放入关联数组val中。

处理完所有记录后,遍历记录数,然后遍历关联数组中的值。因此:

$ awk < file.txt 'BEGIN{rec=1;} {if (NF>2) val[rec][$1]=$3; else rec++;} \
      END {for (i=1;i<=rec;i++) {for (j in val[i]) \
           {printf "%s ",val[i][j];} printf "\n"; }printf "\n";}' | column -t
10.10.19  10  20  Google  Male    1
11.11.19  11  21  Yahoo   Female  2