如何更改这样的文件:
A 25
B 26
A 14
D 39
E 42
A 74
B 36
A 81
D 96
E 17
A 23
B 14
A 74
D 87
E 17
Run Code Online (Sandbox Code Playgroud)
将行作为列,但只有一次,以及它们在列中的相应值?像这样:
A B A D E
25 26 14 39 42
74 36 81 96 17
23 14 74 87 17
Run Code Online (Sandbox Code Playgroud)
我的列每29行重复一次,某些列(如A)具有相同的名称.
您可以使用以下awk
脚本来转换文件:
transform.awk:
{
# On the first record this loop runs twice. once
# for the headers once for the first line of data.
# In all subsequent lines is prints only the data
# because h==1.
for(;h<=1;h++){
for(i=1+h;i<=NF;i+=2){
printf "%s ", $i
}
printf "\n"
}
h=1
}
Run Code Online (Sandbox Code Playgroud)
然后像这样执行:
awk -f transform.awk RS='' file
Run Code Online (Sandbox Code Playgroud)
输出:
A B A D E
25 26 14 39 42
74 36 81 96 17
23 14 74 87 17
Run Code Online (Sandbox Code Playgroud)
要获得正确对齐的列,您可以管道column -t
:
awk -f transform.awk RS='' file | column -t
Run Code Online (Sandbox Code Playgroud)
输出:
A B A D E
25 26 14 39 42
74 36 81 96 17
23 14 74 87 17
Run Code Online (Sandbox Code Playgroud)
这里的关键是变量的使用RS
(记录分隔符).使用空字符串以RS
空行分隔记录.它与将其设置为\n\n+
(一个或多个空行)相同.示例的第一条记录如下所示:
A 25
B 26
A 14
D 39
E 42
Run Code Online (Sandbox Code Playgroud)
awk
默认情况下,拆分[[:space:]]+
包括换行符.这为记录1提供了以下字段.
A 25 B 26 A 14 D 39 E 42
Run Code Online (Sandbox Code Playgroud)
上面显示的算法将此字段转换为所需的输出.