列を追加、列全体をファイル名(「.csv」を除く)で埋める - BaSHの複数のファイルについて

列を追加、列全体をファイル名(「.csv」を除く)で埋める - BaSHの複数のファイルについて

警告:完全初心者です。 .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

使用awkcolumn:

$ 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

おすすめ記事