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