使用bash(sed/awk)提取CSV文件中的行和列?

use*_*415 14 csv bash awk sed

bash是否能够处理从csv文件中提取行和列?希望我不必诉诸python ..

我的5列csv文件看起来像:

Rank,Name,School,Major,Year
1,John,Harvard,Computer Science,3
2,Bill,Yale,Political Science,4
3,Mark,Stanford,Biology,1
4,Jane,Princeton,Electrical Engineering,3
5,Alex,MIT,Management Economics,2
Run Code Online (Sandbox Code Playgroud)

我只想提取第3,第4和第5列内容,忽略第一行,所以输出如下:

Harvard,Computer Science,3
Yale,Political Science,4
Stanford,Biology,1
Princeton,Electrical Engineering,3
MIT,Management Economics,2
Run Code Online (Sandbox Code Playgroud)

到目前为止,我只能得到awk打印出我的CSV文件的每一行或每一列,但不是像这种情况那样打印特定的cols/rows!bash可以这样做吗?

tha*_*guy 17

awk -F, 'NR > 1 { print $3 "," $4 "," $5 }' 
Run Code Online (Sandbox Code Playgroud)

NR是当前行号,而$ 3,$ 4和$ 5是由给予-F的字符串分隔的字段

  • 您可以设置`OFS =','`这样您就不必在打印中连接逗号. (8认同)

hen*_*nnr 9

试试这个:

tail -n+2 file.csv | cut --delimiter=, -f3-5
Run Code Online (Sandbox Code Playgroud)

  • 最简单优雅的解决方案. (2认同)

koo*_*ola 6

Bash解决方案;

使用IFS

#!/bin/bash
while IFS=',' read -r rank name school major year; do
    echo -e "Rank\t: $rank\nName\t: $name\nSchool\t: $school\nMajor\t: $major\nYear\t: $year\n"
done < file.csv
IFS=$' \t\n'
Run Code Online (Sandbox Code Playgroud)

使用字符串操作和数组

#!/bin/bash
declare -a arr
while read -r line; do
    arr=(${line//,/ })
    printf "Rank\t: %s\nName\t: %s\nSchool\t: %s\nMajor\t: %s\nYear\t: %s\n" ${arr[@]}
done < file.csv
Run Code Online (Sandbox Code Playgroud)


Rub*_*ens 5

使用cuttail:

tail -n +2 file.txt | cut -d ',' -f 3-
Run Code Online (Sandbox Code Playgroud)

  • OP希望跳过第一行,这就是我们使用`tail`的原因. (2认同)