我有一个以文件中的文件名列表开头的脚本。对于列表中的每个文件,脚本会尝试
- 查看文件中的一行
- 如果该行中的第 2 列
---
然后从同一行获取第 4 列中的值,则使用该---
值从另一个存档文件中 grep 缺失值(具有相同的文件名,但位置和扩展名不同) - 然后
---
用 grepped 值替换。
因此,我想要的输出是原始文件,所有实例都---
根据另一列的查找更改为正确的值。
这是我为此编写的脚本:
#!/bin/bash
# process the files in the list
for fname in $mylist ; do
for line in $fname ; do
name=$(echo $fname | awk -F"/" '{print $9}' | sed 's:.ext::g'); #getbasename to help find archive file
dash=$(awk < "$line" '{print $2}'); #get col2 of the line (may have the "---" missing value")
loca=$(awk < "$line" '{print $4}'); #col 4 for grepping
if [$dash -eq "---"]; then
ID=$(grep -F -w "$loca" /path/archiveFiles/$name | awk '{print $2}'); #find the missing value in the relevant archive file, using $loca as the lookup key
fixed=$(awk -v snpID="$ID" '{OFS="\t"} {print $1,ID, $3, $4}' "$fline");
echo "$fixed" ;
else echo "$line" ;
fi
done >>/path/correctedFiles/$name.ext &
done
wait
该脚本当前给出 sterror 说“第 XX 行:IDNNNN:找不到命令”第 XX 行在脚本中不存在(实际上它是脚本中的最后一行并且是空的)IDNNNN 是我试图 grep 的缺失值之一从存档文件。谁能帮我解决这个输出?谢谢
:edited 脚本更好地解释 grep ;再次编辑示例文件和错误消息:mylist:
> path/dir/file_1_17.03s.07.ext path/dir/file_1_2.51p.12.ext
> path/dir/file_2_112.07.ext path/dir/file_2_155.07.ext
> path/dir/file_13_1.5.12-13.ext
file_1_17.03s.07.ext 的内容(所有文件格式相同)
> 1 ID45 0 KEY7
> 1 ID46 0 KEY45
> 1 --- 0 KEY501
> 1 ID48 0 KEY6
从中 grep 缺失数据的存档文件的内容,即文件 file_1_17.03s.07.ext,查看 /path/archiveFiles/file_1_17.03s.07.arc
X1 ID45 KEY7 X2 ID46 KEY45 X3 ID47 KEY501 X4 ID48 KEY6
我上面要做的是更正列表中的每个文件,使用相关存档文件中的 KEY 列,以便 file_1_17.03s.07.ext 的内容变为
1 ID45 0 KEY7 1 ID46 0 KEY45 1 ID47 0 KEY501 1 ID48 0 KEY6
运行我的脚本时出错;
> /var/spool/stuff: line 53: ID45: command not found /var/spool/stuff:
> line 53: ID46: command not found (and so on)
运行建议的更正错误;
/var/spool/stuff: line 53: file_1_17.03s.07: command not found /var/spool/stuff: line 53: file_1_2.51p.12.: command not found (and so on)