使用AWK获取一系列列并将它们打印为单列

时间:2014-05-14 01:23:37

标签: unix awk

我有一个文件,我想要打印列i> N的每个条目,然后是下一列的内容。每行具有相同的列数。输入示例:

a b c d 
a1 b1 c1 d1 
a2 b2 c2 d2 
a3 b3 c3 d3 

说在这种情况下我想跳过第一列,所以所需的输出将是

 b
 b1
 b2
 b3
 c
 c1
 c2
 c3
 d
 d1
 d2
 d3

我接近我想要的东西

awk '{for(i=2; i<=NF; print $i; i++)}'

但是这会连续打印一行中的每个条目,而不是连续地从每列中删除所有条目。

提前致谢

2 个答案:

答案 0 :(得分:1)

如果每一行都有相同数量的字段,那么你可以这样做:

awk '
{
    for(i=2;i<=NF;i++) 
        rec[i]=(rec[i]?rec[i]RS$i:$i)
}
END {
    for(i=2;i<=NF;i++) print rec[i]
}' file 

如果字段数不均匀,则需要记住哪一行具有最大字段数。

awk '
{
    for(i=2;i<=NF;i++) {
        rec[i]=(rec[i]?rec[i]RS$i:$i)
    }
    num=(num>NF?num:NF)
}
END {
    for(i=2;i<=num;i++) print rec[i]
}' file

<强>输出:

b
b1
b2
b3
c
c1
c2
c3
d
d1
d2
d3

答案 1 :(得分:1)

使用cut会更容易:

# figure out how many fields
read -a fields < <(sed 1q file)
nf=${#fields[@]}

# start dumping the columns.
n=3
for ((i = n; i <= nf; i++)); do
    cut -d " " -f $i file
done