Bash,如何以逗号分隔的形式分隔/拆分值

时间:2014-12-01 06:04:37

标签: regex bash awk

我这里有我的脚本,它将从文件中提取值。我的问题是当有多个值时(特别是在数字变量中), 我不知道如何将它们分开。我只想出逗号分隔的形式。

#!/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字段中,它们必须分开/取消连接。这可行吗?

1 个答案:

答案 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脚本是完全正确的;但是如果不了解您正在处理的文件,则需要进行大量猜测。如果您有输入文件格式的实际规范,那将有助于减少不确定性。