我正在处理该学生的信息:
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 文件时,就是执行操作的地方
- 在 中
Perl
,condition1 .. condition2
是 的触发器运算,
符a.lased
.。但它更通用,从某种意义上说,我们可以为..
输入添加更多条件。特别是,在我们的例子中,当行以 name: 开头,后跟多个空格,然后捕获学生姓名并 $h{$a=$1} 测试是否找到具有 TRUE 值的该学生姓名时,会形成/^name:\s+(\S+)/ && $h{$a=$1}
一个组合cond1
。 (注意:所以 => 如果 ID 为零,则会出错!)。一旦执行了这一步,操作flip-flop
符就保持 true,并且我们一直这样做,直到看到空行或点击EOF
。在这个特定步骤中,我们$_
用散列中的 id 数据填充当前行。