14

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

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

Harvard,Computer Science,3
Yale,Political Science,4
Stanford,Biology,1
Princeton,Electrical Engineering,3
MIT,Management Economics,2

到目前为止,我只能让 awk 打印出我的 CSV 文件的每一行或每一列,而不是像这种情况下的特定列/行!bash 可以做到这一点吗?

4

11 回答 11

19
awk -F, 'NR > 1 { print $3 "," $4 "," $5 }' 

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

于 2013-01-24T01:55:11.227 回答
9

试试这个:

tail -n+2 file.csv | cut --delimiter=, -f3-5
于 2013-10-02T09:54:26.377 回答
6

使用cuttail

tail -n +2 file.txt | cut -d ',' -f 3-
于 2013-01-24T01:53:09.283 回答
6

重击解决方案;

使用 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'

使用字符串操作和数组

#!/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
于 2013-01-24T03:42:29.063 回答
3
sed 1d file.csv | while IFS=, read first second rest; do echo "$rest"; done
于 2013-01-24T04:34:42.583 回答
2

给你,一个简单的 AWK 程序。

#!/usr/bin/awk -f

BEGIN {
    # set field separator to comma to split CSV fields
    FS = ","
}

# NR > 1 skips the first line
NR > 1 {
    # print only the desired fields
    printf("%s,%s,%s\n", $3, $4, $5)
}
于 2013-01-24T01:57:21.803 回答
2
perl -F, -lane 'if($.!=1){print join ",",@F[2,3,4];}' your_file

在这里检查

于 2013-01-24T07:27:22.910 回答
2

这可能对您有用(GNU sed):

sed -r '1d;s/([^,]*,){2}//' file
于 2013-01-24T07:42:18.527 回答
2

试试这个

awk -F, 'NR > 1 { OFS=",";print $3, $4, $5 }' temp.txt

或这个

sed -re '1d;s/^[0-9],\w+,//g' temp.txt
于 2013-01-24T12:01:35.620 回答
1

我已经为这类任务创建了包 - gumba 如果您对 coffeescript 感到满意,您可以尝试一下

cat file.csv | tail -n +2 | \
gumba "words(',').take((words)-> words.last(3)).join(',')"`
于 2013-04-11T14:02:46.170 回答
0
grep '^,' outlook.contacts.csv | sed 's/^,\([^,]*\),[^,]*,\([^,]*\),.*/\1 \2/'

获取所有以 a 开头的行,,然后用sed名字和名字替换空白字段。

出于某种原因,一旦您将其更改为此行,请小心谨慎,因此您最好手动小心地进行操作。

grep '^,' outlook.contacts.csv | sed 's/^,([^,]),[^,],([^,]),./\1 \2/'
于 2014-10-09T15:32:01.390 回答