我的文件看起来像这样:
A=10 B=8 C=12
A=15 B=12 C=5
A=6 B=4 C=9
A=8 B=8 C=9
列更多。我想使用awk拆分所有文件,并在“=”之前使用字母,如标题:
A B C
10 8 12
15 12 5
6 4 9
8 8 9
我想做点什么:
awk '{split($0,arr0,"="); print arr0[2]}' infile
但仍然不知道如何使用arr0[1]
之类的标题。
感谢您的任何想法。
答案 0 :(得分:4)
$ awk 'NR==1{h=$0;gsub(/=[^ ]+/,"",h);print h} {gsub(/[^ =]+=/,"")} 1' file
A B C
10 8 12
15 12 5
6 4 9
8 8 9
答案 1 :(得分:3)
使用awk你可以这样做:
awk -F '[= ]' 'function prnt(start) {
for (i=start; i<=NF; i+=2)
printf "%s%s", (i==start?"":OFS), $i
print ""
}
NR==1 {
prnt(1)
}
{
prnt(2)
}' file
A B C
10 8 12
15 12 5
6 4 9
8 8 9
要获得表格格式化输出,请使用:
awk -F '[= ]' 'function prnt(start) {
for (i=start; i<=NF; i+=2)
printf "%s%s", (i==start?"":OFS), $i
print ""
}
NR==1 {
prnt(1)
}
{
prnt(2)
}' file | column -t
A B C
10 8 12
15 12 5
6 4 9
8 8 9
答案 2 :(得分:1)
使用sed
sed '1{h;s/=[^ ]*//g;p;x};s/.=//g' file
A B C
10 8 12
15 12 5
6 4 9
8 8 9
答案 3 :(得分:1)
perl
$ cat ip.txt
A=10 B=8 C=12
A=15 B=12 C=5
A=6 B=4 C=9
A=8 B=8 C=9
$ # can also use: perl -lpe 'print / ?[^ ]+(?==)/g if $.==1; s/[^ ]+=//g'
$ perl -pe 'if($. == 1){$a = s/=[^ ]+//rg; print "$a\n"} s/[^ ]+=//g' ip.txt
A B C
10 8 12
15 12 5
6 4 9
8 8 9
if($. == 1){$a = s/=[^ ]+//rg; print "$a\n"}
,删除右侧的=
和非空格字符。替换结果保存在$a
并打印而不修改输入行s/[^ ]+=//g
删除所有行的=
后面的非空格字符-p
选项表示默认情况下在所有修改后打印输入行答案 4 :(得分:1)
试试这个:
#!/bin/awk
function print_record( hdr )
{
for( i = 1; i <= NF; i++ )
{
split( $i, a, "=" )
printf a[ ( hdr == 1 ) ? 1 : 2 ] " "
}
print ""
}
BEGIN {
hdr=1
}
{
if( hdr == 1 )
{
print_record( 1 )
hdr = 0;
}
print_record( 0 )
}
# eof #
测试:
$ awk -f script.awk -- input.txt
输出:
A B C
10 8 12
15 12 5
6 4 9
8 8 9
希望它有帮助!
答案 5 :(得分:1)
Gnu awk:
split($0,a,"[ =]") && NR==1 { # split the record from <space> and "="
print a[1],a[3],a[5] # first record, print odds
# for(i=1;i<=NF*2;i+=2) # you could replace above print with this
# printf "%s", a[i] OFS; print ""
}
{
print a[3],a[4],a[6] # the rest of records, print evens
# for(i=2;i<=NF*2;i+=2) # you could replace above print with this
# printf "%s", a[i] OFS; print ""
}
测试它:
$ awk foo.awk foo.txt
A B C
10 8 12
15 12 5
6 4 9
8 8 9
答案 6 :(得分:1)
这是一个精简的awk
实施:
BEGIN{
print "A", "B", "C";
}
{
split($1, a, /=/);
split($2, b, /=/);
split($3, c, /=/);
print a[2], b[2], c[2];
}
...和输出:
$ awk -f /tmp/script.awk </tmp/input
A B C
10 8 12
15 12 5
6 4 9
8 8 9