如何读取 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
我有一个包含两列数据的数据文件 '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