INPUT
fish \t 1 \t red
fish \t 2 \t blue
fish \t 4 \t green
dog \t 1 \t blue
dog \t 3 \t yellow
cat \t 3 \t orange
输出:
fish \t red \t blue \t _______ \t green
dog \t blue \t ____ \t yellow
cat \t ____ \t ____ \t orange
我希望生成一个数组,同时保持第2列从输入文件中给出的顺序。 在这个例子中,由于没有第2列= 3的行,我希望用“”推送。
我正在使用的实际文件最多有98个位置来填充一个数组。
Perl专家的任何建议?
谢谢!
答案 0 :(得分:1)
试试这个(您可以将"___"
更改为FS
):
$ awk '
BEGIN { FS=OFS="\t" }
NR==1 { a=$1; b[$2]=$3; next; }
$1==a { b[$2]=$3; f2=$2; next; }
{
printf "%s\t",a;
for(i=1;i<=f2;i++) { printf (b[i]) ? b[i] FS : "___" FS }
a=$1;
delete b;
b[$2]=$3;
print ""
}
END {
printf "%s\t",a;
for(i=1;i<=f2;i++) { printf (b[i]) ? b[i] FS : "___" FS }
print ""
}' file
fish red blue ___ green
dog blue ___ yellow
cat ___ ___ orange
答案 1 :(得分:0)
$ awk -F'\t' '
!seen[$1]++ { keys[++k] = $1 }
NR==1 { min = max = $2 }
{
min = ($2<min?$2:min)
max = ($2>max?$2:max)
map[$1,$2] = $3
}
END {
for (k=1;k in keys;k++) {
key = keys[k]
printf "%s", key
for (c=min; c<=max; c++) {
val = ( (key,c) in map ? map[key,c] : "___" )
printf "%s%s", FS, val
}
print ""
}
}
' file
fish red blue ___ green
dog blue ___ yellow ___
cat ___ ___ orange ___