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

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'

文字列操作と配列の使用

#!/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

これはうまくいくかもしれません(GNU sed):

sed -r '1d;s/([^,]*,){2}//' file
于 2013-01-24T07:42:18.527 に答える
2
perl -F, -lane 'if($.!=1){print join ",",@F[2,3,4];}' your_file

ここをチェック

于 2013-01-24T07:27:22.910 に答える
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

これを試して

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 に答える
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 に答える