説明する

説明する

私はこの学生の情報を処理しています:

name: Romeo
e_mail: [email protected]
Room: 0/48
street: 1/0/48

name: April
e_mail: [email protected]
Room: 0/4
street: 1/0/4

name: Julian
e_mail: [email protected]
Room: 0/2
street: 1/0/2

name: Charles
e_mail: [email protected]
Room: 0/1
street: 1/0/1

name: Chris
e_mail: [email protected]
Room: 0/42
street: 1/0/42

name: Richard
e_mail: [email protected]
Room: 0/6
street: 1/0/6

この.csvファイルもあります。

id,name,e_mail
st0001, Romeo, [email protected]
st0002, Julian, [email protected]
st0003, Chris, [email protected]
st0004, Richard, [email protected]

.csvファイルからIDを取得し、次のように.datファイルに追加したいと思います。

name: Romeo
e_mail: [email protected]
Room: 0/48
street: 1/0/48
id: st0001    

name: April
e_mail: [email protected]
Room: 0/4
street: 1/0/4

name: Julian
e_mail: [email protected]
Room: 0/2
street: 1/0/2
id: st0002

name: Charles
e_mail: [email protected]
Room: 0/1
street: 1/0/1

name: Chris
e_mail: [email protected]
Room: 0/42
street: 1/0/42
id: st0003

name: Richard
e_mail: [email protected]
Room: 0/6
street: 1/0/6
id: st0004

これまで私はこれを試しました:

#!/bin/bash

    FILE1=students.dat
    FILE2=table.csv

    while read line; do
        if [[ $line == name* ]]; then
            echo -e "\n$line"
            expectIp=1
        elif [[ $line == *e_mail* && $expectIp -eq 1 ]]; then
            sed 's/^\s*//' <<< $line
            unset expectIp
        elif [[ $line == Room* ]]; then
            Room=$(echo $line | grep -o 'Room[^,]*,' | sed 's/,//')
            echo $Room
            echo $line | grep -o 'street*'
            justRoom=$(echo $Room | sed 's/Room: //')
            grep -A1 \"$justRoom\" $FILE2 | grep -o 'id'
        fi
    done < $FILE1

最終スクリプトにはエラーがたくさんありました。

.csvファイルからIDを取得する方法を見つけました。

grep  "[email protected]" students.csv | awk -F "\"*,\"*" '{print $1}'

.datファイルに自動的に追加するにはどうすればよいですか?

ベストアンサー1

perl -F',\s+' -lane '
   @ARGV and $h{$F[1]}=$F[0],next;

   /^name:\s+(\S+)/ && exists $h{$a=$1} .. /^$/ || eof and do{
      /^$/ || eof and $_ .= (/^$/ ? $, : $\) . ("id: " . $h{$a} // "") . (eof ? $, : $\);
   };

   print;
' table.csv students.dat

説明する

Perlオプション

  • -Fフィールド区切り記号は次のように設定されます。,\s+
  • -l出力レコード区切り文字は、次のように設定されます。\n
  • -a自動分割モード=>配列に@Fフィールドが含まれています$1,$2,...,$NF
  • -n必要な場合にのみ印刷+暗黙的に行を読む、a.la。awk

ロジック

  • パラメータの順序は.csvファイル、次に.datファイルです。
  • @ARGV and=>考慮される入力ファイルが.csvの場合はotw .dat
  • .csvファイルデータのキーを名前に、値をIDにハッシュ%hを入力します。
  • これで、.datファイルを処理するときにここで作業が行われます。
  • にはトリガー演算子a.laがありますPerl。ただし、入力にさらに条件を追加できるという点で、これはより一般的です。具体的には、この例では、行が名前:で始まり、その後に複数のスペースが続く場合は組み合わせが形成され、生徒名をキャプチャし、$ h {$ a = $ 1}対応する生徒名がTRUE値として見つかったかどうかをテストします。 (注:したがって、=> IDが0の場合はエラーが発生します!)この手順が実行されると、演算子はtrueのままになり、空の行が表示されるかをクリックするまでこの操作を続けます。この特定のステップでは、現在の行をハッシュのIDデータで埋めます。condition1 .. condition2,sed../^name:\s+(\S+)/ && $h{$a=$1}cond1flip-flopEOF$_

おすすめ記事