5

二重引用符 ( sampleField="sampleValue") で囲まれたすべてのデータを出力しようとしましたが、二重引用符で囲まれたデータのすべてのインスタンスを取得awkおよび/またはsub返すのに問題があります。gsub次に、データをまとめるために、見つかったそれぞれの行にすべてのインスタンスを出力したいと思います。

input.txtファイルのサンプルを次に示します。

deviceId="1300", deviceName="router 13", deviceLocation="Corp"
deviceId="2000", deviceName="router 20", deviceLocation="DC1"

私が探している出力は次のとおりです。

"1300", "router 13", "Corp"
"2000", "router 20", "DC1"

gsub を使用して a,との間のすべてのデータを削除するのに問題があり=ます。別のアプローチを試すたびに、常に最初のフィールドが返され、次の行に移動します。

アップデート:

二重引用符でカプセル化されたフィールドが各行にいくつあるかわからないことを忘れていました。1、3、または 5,000 の可能性があります。これがソリューションに影響するかどうかはわかりませんが、それが存在することを確認したかった.

4

6 に答える 6

5

sed解決策:

sed -r 's/[^\"]*([\"][^\"]*[\"][,]?)[^\"]*/\1 /g'
    <<< 'deviceId="1300", deviceName="router 13", deviceLocation="Corp"'

出力:

"1300", "router 13", "Corp"

またはファイルの場合:

sed -r 's/[^\"]*([\"][^\"]*[\"][,]?)[^\"]*/\1 /g' input.txt
于 2013-01-23T20:12:22.843 に答える
2
awk -F '"' '{printf(" %c%s%c, %c%s%c, %c%s%c\n", 34,$2, 34, 34, $4,34, $6, 34) } ' \
    input file > newfile

フィールド区切り文字として引用符を使用する、別のより簡単なアプローチです。

awk 'BEGIN{ t=sprintf("%c", 34)}
     { for(i=1; i<=NF; i++){
        if(index($i,t) ){print $i}  }; printf("\n")}'  infile > outfile

より一般的な awk アプローチ。

于 2013-01-23T20:05:33.740 に答える
1
awk -F \" '
    {
        sep=""
        for (i=2; i<=NF; i+=2) {
            printf "%s\"%s\"", sep, $i
            sep=", "
        }
        print ""
    }
' << END
deviceId="1300", deviceName="router 13", deviceLocation="Corp", foo="bar"
deviceId="2000", deviceName="router 20", deviceLocation="DC1"
END

出力

"1300", "router 13", "Corp", "bar"
"2000", "router 20", "DC1"
于 2013-01-23T22:52:13.133 に答える
0

これを試して

awk -F\" '{ for(i=2; i<=NF; i=i+2){ a = a"\""$i"\""",\t";} {print a; a="";}}' temp.txt

出力

"1300",  "router 13",     "Corp"
"2000",  "router 20",     "DC1"
于 2013-01-24T05:57:22.450 に答える