私はこの学生の情報を処理しています:
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}
cond1
flip-flop
EOF
$_