Shell 代码 - 循环读取 CSV 文件并制作另一个
Posted
技术标签:
【中文标题】Shell 代码 - 循环读取 CSV 文件并制作另一个【英文标题】:Shell code- Reading a CSV file by loop and making another one 【发布时间】:2016-07-17 05:28:50 【问题描述】:我必须执行 Shell 代码,逐行读取 CSV 文件,检查某些列值中的每一行,并根据条件制作另一个新的 CSV 文件。
我已经开始这样的代码:
FileName=$1
while read line
do
zcat FileName awk -F'\t' '$3 ~/.jar/ || $3 ~/.msi/ || $3 ~/.dll/ || $3 ~/.cab/ || $3 ~/.exe/ || $3 ~/.rar/ || $3 ~/.mar/ || $3 ~/.tgz/ || $3 ~/.tar/ || $3 ~/.gz/ || $3 ~/.upd/ || $3 ~/.bin/ || $3 ~/.zip/ || $3 ~/.pogo/ || $3 ~/.dcr/ || $3 ~/.qgi/ || $3 ~/.deb/ || $3 ~/.ipa/ || $3 ~/symantec/ || $3 ~/windowsupdate/ || $3 ~/kaspersky/ || $3 ~/adobe.com/ && $42 ~/7/ && $15 ~/androiddownloadmanager/ && $15 ~/.apk/ && $15 ~/.pak/ && $15 ~/.vpx/ Str="SW Download: " $3;Str>> New.csv '
echo "$line" >> new2.csv
done < FileName
注意:文件名为.gz。
(1)我收到错误:“意外标记‘完成’附近的语法错误”。
(2)我想检查新的 csv 是否会完成并包含行。
谢谢
【问题讨论】:
zcat Filename
之后和 $ 在同一行的 Filename 之前缺少管道?另外,为什么要在shell中循环它?为什么不让 awk 处理整个文件而不是为每一行运行它? Filename=$1; zcat $Filename | awk - -
你真的是说$15
需要同时匹配这四个不同的正则表达式吗?这就是你的代码的意思。
【参考方案1】:
您不需要 shell 循环。只需将zcat
输出到awk
:
FileName=$1
zcat "$FileName" | awk -F'\t' '($3 ~/\.jar/ || /\.msi/ || /\.dll/ || /\.cab/ || /\.exe/ || /\.rar/ || /\.mar/ || /\.tar/ || /\.gz/ || /\.upd/ || /\.bin/ || /\.zip/ || /\.pogo/ || /\.dcr/ || /\.qgi/ || /\.deb/ || /\.ipa/ || /symantec/ || /windowsupdate/ || /kaspersky/ || /adobe\.com/) && $42 ~/7/ && ($15 ~/androiddownloadmanager/ && /\.apk/ && /\.pak/ && /\.vpx/) Str="SW Download: " $3;print Str > "New.csv"'
使用变量的正确语法是$FileName
,而不是FileName
。
更新:
正如triplee 所指出的,awk
命令应该是:
zcat "$FileName" | awk -F'\t' '($3 ~/\.(jar|msi|dll|cab|exe|rar|mar|tar|gz|upd|bin|zip|.pogo|dcr|qgi|deb|ipa)/ || $3 ~/(symantec|windowsupdate|kaspersky|adobe\.com)/) && $42 ~/7/ && $15 ~/androiddownloadmanager/ && $15 ~/\.apk/ && $15~/\.pak/ && $15~/\.vpx/ Str="SW Download: " $3;print Str '
【讨论】:
呃,这里的语法不正确。($3 ~ /\.moo$/ || /\.bar$/)
等价于 $3 ~ /\.moo$/ || $0 ~ /\.bar$/
(还要注意括号是多余的)。您必须重复 $3 ~
或重构为单个正则表达式 $3 ~ /\.(moo|bar)$/
。
谢谢@tripleee 我更新了,但保留了括号,因为这里有||
和&&
的混合。以上是关于Shell 代码 - 循环读取 CSV 文件并制作另一个的主要内容,如果未能解决你的问题,请参考以下文章
如何通过读取shell脚本中的csv文件来将2列的总和添加到新列中
python 读取多个csv文件中某一列,并生成一个新csv文件