警告:完全初心者です。 .csvファイルに列を追加する必要があります。ここでは、列ヘッダーは「名前」にすることができますが、列全体は、ファイル自体の名前、.csvファイルの名前など、まったく同じでなければなりませんfilename
。これでファイルごとに3つの変数しかありませんが、2100行になります。
例: ファイルの場合"bcc1_45Fall_10010002.csv"これが私が持っているものです -
HUC8 YEAR RO_MM
10010002 1961 74.7
10010002 1962 69.1
10010002 1963 52.0
10010002 1964 130.7
10010002 1965 32.2
10010002 1966 85.4
これが私が望むものです -
NAME HUC8 YEAR RO_MM
bcc1_45Fall_10010002 10010002 1961 74.7
bcc1_45Fall_10010002 10010002 1962 69.1
bcc1_45Fall_10010002 10010002 1963 52.0
bcc1_45Fall_10010002 10010002 1964 130.7
bcc1_45Fall_10010002 10010002 1965 32.2
bcc1_45Fall_10010002 10010002 1966 85.4
またはこれ -
HUC8 YEAR RO_MM
bcc1_45Fall_10010002 1961 74.7
bcc1_45Fall_10010002 1962 69.1
bcc1_45Fall_10010002 1963 52.0
bcc1_45Fall_10010002 1964 130.7
bcc1_45Fall_10010002 1965 32.2
bcc1_45Fall_10010002 1966 85.4
「HUC8」列のすべてのデータを簡単に置き換えることができればfilename
完璧です。追加の列である必要はありません。
何千ものファイルに対してこれを行う必要があります。
最初の部分を実行する方法を知っている場合は、ループを作成できます。しかし、もっと良い方法がありますか?
どこから始めるべきかわかりません。
ベストアンサー1
使用awk
とcolumn
:
$ awk '
NR==1{ sub(/\.csv$/, "", FILENAME) } # remove .csv suffix from FILENAME
NR>1{ $1=FILENAME } # replace the first field with filename
1 # print record
' bcc1_45Fall_10010002.csv | column -t
HUC8 YEAR RO_MM
bcc1_45Fall_10010002 1961 74.7
bcc1_45Fall_10010002 1962 69.1
bcc1_45Fall_10010002 1963 52.0
bcc1_45Fall_10010002 1964 130.7
bcc1_45Fall_10010002 1965 32.2
bcc1_45Fall_10010002 1966 85.4
シェルループでこのコマンドを実行して、変更したファイルをディレクトリに保存できますmodified_files
。
mkdir modified_files &&
for i in *.csv; do
awk 'NR==1{ sub(/\.csv$/, "", FILENAME) } NR>1{ $1=FILENAME }1' "$i" |
column -t > "./modified_files/$i"
done
列を置き換える必要がありますが、HUC8
これが最初の列でない場合は、コードを次のように変更します。
awk -v search='HUC8' '
NR==1{
for(i=1;i<=NF;i++)
if ($i==search){ fld=i; sub(/\.csv$/, "", FILENAME); break }
}
NR>1{ $fld=FILENAME }
1
' file.csv | column -t