我有一个数据文件'file1.csv‘,它有两列数据,需要读取文件内容,并根据第一列字符串值'finance & total’和类似的‘营销和总计’找出行之间的信息。脚本应该找到“财务”和“财务总计”,然后得到(A,B,D,H)之间的记录,脚本应该找到“营销”和“营销总计”,然后得到(C,E,G)之间的记录。我不想在“金融”和“营销总计”字符串之后获得记录。
还需要跳过第二个或第三个字段有nan字符串的行。
我尝试了下面的代码,但没有得到预期的输出。
while read line
do
if [[ $line == "finance" ]]; then
echo $line >> output.csv
else
echo ""
fi
done < file1.csv
file1.csv:
Departments Accounts ##Header
Monthwise data ##Sub Header
IT,Amount
P,20
q,30
IT Total,50
Finance,Amount
A,20
B,30
D,60
H,50
Finance Total,160
<Empty space>
Marketing,Amount
C,40
E,10
G,60
Marketing Total,110
HR,amount
X,20
Y,50
Z,10预期产出:
department,name,amount
Finance,A,20
Finance,B,30
Finance,D,60
Finance,H,50
Marketing,C,40
Marketing,E,10
Marketing,G,60 预期输出应存储在输出文件中。
发布于 2021-10-13 11:51:45
使用您所显示的示例,请尝试遵循awk程序。简单的解释是,将逗号设置为FS,对所有行设置OFS,并在BEGIN节本身中打印标题。然后在主程序中,检查不同的条件并打印相应的值。注意,这个程序一旦发现了OP提到的Marketing Total,就会退出。
awk '
BEGIN{
FS=OFS=","
print "department,name,amount"
}
/Marketing Total/ { exit }
/Finance Total/ || ($2=="nan" || $3=="nan"){ next }
/Finance,Amount/ || /Marketing,Amount/ { found=1;first=$1;next }
found { print first,$0 }
' Input_file需要将或作为区分大小写的值进行比较,然后尝试下面的代码。
awk '
BEGIN{
FS=OFS=","
print "department,name,amount"
}
/Marketing Total/ { exit }
/Finance Total/ || (tolower($2)=="nan" || tolower($3)=="nan"){ next }
/Finance,Amount/ || /Marketing,Amount/ { found=1;first=$1;next }
found { print first,$0 }
' Input_filehttps://stackoverflow.com/questions/69554704
复制相似问题