我这里有我的脚本,它将从文件中提取值。我的问题是当有多个值时(特别是在数字变量中), 我不知道如何将它们分开。我只想出逗号分隔的形式。
#!/bin/bash
egrep -l 'NG' /home/archive/* > /home/archive/console.txt
chmod 644 /home/archive/console.txt
while read FILE
do
file=$FILE
cat $FILE | awk '{gsub("-",RS);print}' > file1.txt
chmod 644 file1.txt
cat file1.txt | awk '{gsub("*",RS);print}' > file2.txt
chmod 644 file2.txt
date=`sed -n '10p' < file2.txt `
number=`awk 'BEGIN {FS="*"; i=0; ORS=""}
$1=="NG" {a[i++]=$4}
END {
if (i>1) {
print "" a[0]
for (j = 1; j < i; j++)
print "," a[j]
}
if (i==1)
print "" a[0] ""
}' file1.txt`
echo "name: ${file}"
echo "creation_date: $date"
echo "number: ${number}"
done < /home/archive/console.txt
以下是示例file.txt内容:
ABC*72832*123*782327*1234*SRET *723825W43*834734*73298 *2014Nov30*STRR*K*2014*WRERFD*0*P*-TREKTKR*FGSRTR*SRET*72382543*20140613*1805*78403698*O*005010-FD*7C*78405492-NG*VL*847*347*23-KDJRFK*6729*124713-7238S*A-6283HD*723H*124714-7120373*A-8723D*Y*2*2*2-
HSSDQW*7E*78405493-NG*VL*847*347*24-RDERE*872*124715-
使用上面脚本的实际输出是:
name:file1.txt
creation_date:2014Nov30
数量:23,24
另一方面,我的预期输出是这个:
name: file1.txt
creation_date:2014Nov30
number:23
name: file1.txt
creation_date: 2014Nov30
number:24
name和creation_date必须具有相同的值(因为它们位于同一文件中),而在number字段中,它们必须分开/取消连接。这可行吗?
答案 0 :(得分:0)
你不必要地将任务划分为非常小的片段。在单个Awk脚本中完成所有操作将更容易,更简单。
#!/bin/bash
egrep -l 'NG' /home/archive/* |
while read -r file # note -r
do
awk -v RS='-|\n' -v FS='*' '
# Assume date is always on first line, please check?
NR==1 { date=$10 }
$1=="NG" {x[++i]=$4}
END {
for (j = 1; j <= i; j++)
printf "name: %s\ncreation_date: %s\nnumber: %i\n",
FILENAME, date, x[j]
}' "$file"
done
注意脚本如何通过将所有处理保留在单个管道中来避免使用临时文件。
我不确定Awk脚本是完全正确的;但是如果不了解您正在处理的文件,则需要进行大量猜测。如果您有输入文件格式的实际规范,那将有助于减少不确定性。