如何使用新的行号从csv文件打印和存储特定的命名列

时间:2017-08-03 15:03:49

标签: bash csv

首先说,我对使用bash和任何类型的脚本编写都很新。

我有一个csv文件,其下面有基本的列标题和值,例如:

a  b  c  d
3  3  34 4
2  5  4  94
4  5  8  3
9  8  5  7

有没有办法只从特定列中提取数值并为每一行添加一个数字。例如,第一列的第一个编号行(从列标题后面的1开始)是1,然后是2,然后是3等,例如对于列b,输出将是:

1  3
2  5
3  5
4  8

我希望能够为各种不同的命名列标题执行此操作。

任何帮助将不胜感激,

克里斯

3 个答案:

答案 0 :(得分:1)

喜欢这个?使用awk:

$ awk 'NR>1{print NR-1, $2}' file
1 3
2 5
3 5
4 8

说明:

$ awk '              # using awk for the job
NR>1 {               # for the records or rows after the first
    print NR-1, $2   # output record number minus one and the second field or column
}' file              # state the file

我希望能够为各种不同的命名列标题执行此操作。使用awk时,不要指定列标题名称,而是指定列号,就像您没有指定{{ 1}}但是b

答案 1 :(得分:1)

awk 'NR>1 {print i=1+i, $2}' file

NR>1跳过第一行,在您的情况下是标题。

print打印

i=1+i打印i,我先是0然后加1,所以我是1,下次是2,依此类推。

$2打印第二列。

file是您文件的路径。

答案 2 :(得分:0)

如果您有一个简单的多空格分隔文件(如您的示例中所示),awk是此作业的最佳工具。要在awk中按名称选择列,您可以执行以下操作:

$ awk -v col="b" 'FNR==1 { for (i=1;i<=NF;i++) if ($i==col) x=i; next }
                  {print FNR-1 OFS $x}' file   
1 3
2 5
3 5
4 8