web-dev-qa-db-ja.com

csvファイルに新しい列を追加する

ファイル名の最初の4文字が最初の列の値で、次の2文字が2番目の列の値になるように、bashスクリプトを使用してcsvファイルの先頭に2つの新しい列を追加します。たとえば、.csvファイル名が "exam_20"の場合、すべてのエントリが "exam"である新しい最初の列と、すべてのエントリが "20"である新しい2番目の列が必要です。誰かがこれをbashで達成する方法を知っていますか?前もって感謝します。

2
zsha

このコードは、sedを使用してそれを実行し、実行可能ファイルとして保存し、最初の(そして唯一の)パラメーターとしてソースファイルへのフルパスで実行します。必要に応じて、出力を新しいファイルに保存できます。

#!/bin/bash
FILE=$1
# check the file exists
[[ -s $FILE ]] || { echo "Can't locate file '$FILE', aborting" >&2; exit 1; }
# get the filename without directory
NAME=$(basename "$1")
# get the first 4 characters as FIRST
FIRST=${NAME:0:4}
# get the 6th & 7th characters as SECOND
SECOND=${NAME:5:2}
# are we good to go?
read -t30 -p "About to prefix '$FIRST,$SECOND,' to all lines in $FILE - ok (y/-): "
[[ $REPLY == "y" ]] || { echo "No changes made"; exit 0; }
# do it
sed "s/^/$FIRST,$SECOND,/" "$FILE"
exit 0

ファイルexam_02:

line1,some,stuff
line2,some,more,stuff

出力:

exam,02,line1,some,stuff
exam,02,line2,some,more,stuff
2
gogoud

awkの場合:

#!/usr/bin/awk -f

BEGIN { OFS="," };

FNR==1 {
  split(FILENAME,c,/[_.]/);
};

{ print c[1], c[2], $0 }

または、コマンドラインで実行するか、シェルスクリプトに埋め込むワンライナーとして:

awk -v OFS=',' 'FNR==1 {split(FILENAME,c,/[_.]/)}; {print c[1],c[2],$0}' *.csv

入力ファイルごとに、文字クラス[_.]をフィールド区切り文字として使用して、各FILENAMEを配列cに分割します。配列cのフィールド1および2は、ファイルの各行の先頭に追加されます。

出力例:

$ ./zsha.awk exam_20.csv 
exam,20,1,2,3,4
exam,20,5,6,7,8
exam,20,9,10,11,12

この例で使用されている入力データは次のとおりです。

$ cat exam_20.csv 
1,2,3,4
5,6,7,8
9,10,11,12
3
cas