解释

解释

我正在处理该学生的信息:

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

相关内容