如何读取 CSV 文件内容并根据 shell 脚本中的字符串值查找

How to read CSV file content and find out between based on string value in shell script

我有一个包含两列数据的数据文件 'file1.csv',需要读取文件内容并根据第一列字符串值 'finance & total' 和类似的 'marketing & total' 找出行之间。脚本应该找到 'finance' 和 'finance total' 然后获取 (A,B,D,H) 之间的记录 脚本应该找到 'marketing' 和 'marketing total' 然后获取 (C, E,G) 记录。我不想获取 'Finance' 之前和 'Marketing Total' 字符串之后的记录。

还需要跳过第二个或第三个字段具有 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  

预期的输出应存储在输出文件中。

使用您显示的示例,请尝试执行以下 awk 程序。简单的解释是,将逗号设置为 FS,所有行的 OFS 和 BEGIN 部​​分本身的打印标题。然后在主程序中,检查不同的条件并相应地打印值。请注意,根据 OP 的提及,一旦找到 Marketing Total,该程序就会退出。

awk '
BEGIN{
  FS=OFS=","
  print "department,name,amount"
}
/Marketing Total/                          { exit                  }
/Finance Total/ || (=="nan" || =="nan"){ next                  }
/Finance,Amount/ || /Marketing,Amount/     { found=1;first=;next }
found                                      { print first,[=10=]        }
'  Input_file

OR 如果需要将 nan 值与 case in-sensitive 进行比较,请尝试以下代码。

awk '
BEGIN{
  FS=OFS=","
  print "department,name,amount"
}
/Marketing Total/                                            { exit                  }
/Finance Total/ || (tolower()=="nan" || tolower()=="nan"){ next                  }
/Finance,Amount/ || /Marketing,Amount/                       { found=1;first=;next }
found                                                        { print first,[=11=]        }
'  Input_file