0

db export .txt ファイルがあります。二重引用符で囲まれた要素 ("Test_data1")。要素間の区切りはタブ記号(\t)です。サイズは1Gb以上。

Example(this is 1 string):

"Test_data1"    "Test_data2"    "1s"    "452"   "Test
data643"    "
"   "4d"    "System"    "Institute"

問題: 2 列目に特定の条件を持つ文字列を見つけて出力する

awk -F\"'\t'\" '$2 ~ /Test_data2/ {print $0}' input.txt >> sorted/result.txt

しかし、二重引用符 ("") 内の改行記号 (\n) をこの検索から除外するにはどうすればよいですか?

"" ("\n") 内に改行記号があるため、RS パラメータを使用できません。

4

2 に答える 2

0

利用可能なgawkがある場合は、これを試すことができます。

gawk 'BEGIN {FS = "\"\t\""; RS = "[^\t]\"\n"}; 
      $2 ~ /Test_data2/ {print $0 RT};' input.txt

それ以外の場合は、これを試すことができます:

ファイル a.awk:

BEGIN {RS="\t"; FS="\n"; rest = "";}

{    
    s = rest $0; i = 1; success = 0;

    while (1) 
    {   
        if (i == 2 && $1 ~ "f2") success = 1;    

        if ((NF == 2 && $0 ~ "\"\n\"") || (getline) <= 0)  
        {   
            rest = $2; 
            break;
        }   

        s = s RS $1; 
        i++;
    }   

    if (success) print s;
}

走る: awk -f a.awk input.txt

幸運を。

于 2013-08-06T15:48:03.927 に答える
0

これは、一般的な CSV 解析の問題の特定のケースです。一般的な解決策は Lorance Stinson (google Stinson awk CSV parser) によって提供されていますが、この特定の問題に対処する最も簡単な方法は、二重引用符内の改行を他の文字に変換し、レコードごとに 1 行の形式でファイルを処理することです。 、次に元に戻します。例:

$ cat file
"Test_data1"    "Test_data2"    "1s"    "452"   "Test
data643"    "
"   "4d"    "System"    "Institute"
"Test_data3"    "Test_data4"    "2s"    "563"   "Test
data754"    "
"   "5d"    "Non System"    "Association"

単一行に変換するには:

$ awk -v FS= '{for (i=1;i<=NF;i++) if ($i=="\"") inQ=!inQ; ORS=(inQ?"♥":"\n") }1' file
"Test_data1"    "Test_data2"    "1s"    "452"   "Test♥data643"    "♥"   "4d"    "System"    "Institute"
"Test_data3"    "Test_data4"    "2s"    "563"   "Test♥data754"    "♥"   "5d"    "Non System"    "Association"

そして元に戻すのは簡単trです:

$ awk -v FS= '{for (i=1;i<=NF;i++) if ($i=="\"") inQ=!inQ; ORS=(inQ?"♥":"\n") }1' file | tr '♥' '
\n'
"Test_data1"    "Test_data2"    "1s"    "452"   "Test
data643"    "
"   "4d"    "System"    "Institute"
"Test_data3"    "Test_data4"    "2s"    "563"   "Test
data754"    "
"   "5d"    "Non System"    "Association"

上記では、引用符内の改行の代わりに control-C を使用し、好きな文字を選択します (改行に変換するために tr ではなく awk または sed を使用する場合は文字列)。

awk と tr の間に元のファイルに対して必要なことを行うコマンドを挿入するだけです。たとえば、逆方向に並べ替えます。

$ awk -v FS= '{for (i=1;i<=NF;i++) if ($i=="\"") inQ=!inQ; ORS=(inQ?"♥":"\n") }1' file | sort -r | tr '♥' '\n'
"Test_data3"    "Test_data4"    "2s"    "563"   "Test
data754"    "
"   "5d"    "Non System"    "Association"
"Test_data1"    "Test_data2"    "1s"    "452"   "Test
data643"    "
"   "4d"    "System"    "Institute"
于 2013-08-06T22:31:13.230 に答える