awkを使用してテキストファイルの列形式を再指定する

awkを使用してテキストファイルの列形式を再指定する

まあ、これは複雑な質問なので、明確に説明します。私が取得するファイルの内容は次のとおりです。

$ Cat File1 
ABC Cool Lol POP {MNB}
ABC Cool Lol POP {MNB}
ABC Cool Lol POP {MNB}
ABC Cool Lol POP {TBMKF}
ABC Cool Lol POP {YUKER}
ABC Cool Lol POP {EFEFVD}

私が望む出力

-Cool MNB +  POP ;
-Cool MNB  + POP ;
-Cool MNB  + POP ;
-Cool TBMKF + POP ;
-Cool YUKER + POP ;
-Cool EFEFVD +POP ;

まず、最後の列を持ってFile1印刷してみました。sed 's/[{}//g' File1 > File3

その後、内容全体をFile1新しいフォルダにコピーしました。File4

cp File1 File4

次に、内部のデータをデータに置き換えますFile4File3角かっこなしのデータは「File1最後の列のデータ」を意味します)。

awk 'FNR==NR{a[NR]=$1;next}{$5=a[FNR]}1' File3 File4 >>File5 

出力は次のようにする必要があります

ABC Cool Lol POP MNB
ABC Cool Lol POP MNB
ABC Cool Lol POP MNB
ABC Cool Lol POP TBMKF
ABC Cool Lol POP YUKER
ABC Cool Lol POP EFEFVD

最後に、私は努力する

awk -F“ " '{print - $2,$5 +,$4 ";"}‘ File5

ところで、好きなように結果が出ませんでしたね。同様のデータであるMNBのみがリストされ、残りは表示されませんでした(最後のデータ列はアーカイブされていました)。

答え1

なぜ物を左右にコピーしたいのかわかりません。簡単なこと

awk '{print "-" $2, substr($5,2,length($5)-2), "+", $4, ";"}' File1

最初に入れた-;最後に入れました。

その間に私達は印刷します

  • $2私たちはそれをそのままにしたいからです。
  • $5最初の文字と最後の文字がない文字列のサブ文字列です。位置2で始まる最初の文字をスキップし(awkは常にこれについて奇妙でした)、元の文字列より2文字短い部分文字列のみを選択して最後の文字を省略します。$5
  • +私たちがそれをしたいから
  • それから$4

しかし、これらの文字列関数がすべてGNU awkに固有のものかどうかはわかりません。

答え2

そしてsed

sed '
    s/\S\+\s/-/
    s/\(\S\+\s\)\{2\}{\(\S\+\)}/\2 + \1;/
    ' File1

そしてアッ多様性

awk -F"[[:blank:]{}]+" '{print "-" $2, $5, "+", $4}' ORS=" ;\n" File1

答え3

シンプルTxR働く:

$ txr -c '@(repeat)
@a @b @c @d {@e}
@(do (put-line `-@b @e + @d ;`))
@(end)' -
ABC Cool Lol POP {MNB}
ABC Cool Lol POP {MNB}
ABC Cool Lol POP {MNB}
ABC Cool Lol POP {TBMKF}
ABC Cool Lol POP {YUKER}
ABC Cool Lol POP {EFEFVD}
[Ctrl-D][Enter]
-Cool MNB + POP ;
-Cool MNB + POP ;
-Cool MNB + POP ;
-Cool TBMKF + POP ;
-Cool YUKER + POP ;
-Cool EFEFVD + POP ;

TXR Lispの使用マクロ音域awkソリューション:

 txr -e '(awk (t (prn `-@[f 1] @{[f 4] [1..-1]} + @[f 3] ;`)))'

フィールドはfリストにあり、インデックスはゼロから始まります。

答え4

$1,$2,...フィールドに使用したい正確な文字列がすでに含まれている場合は、awkを使用するのが最も簡単です。フィールド区切り文字に複数の文字が含まれている場合は、正規表現として解釈されます。 {中括弧}を削除するために検索と置換、または部分文字列操作を実行する必要はありません。私たちはそれらを区切り記号の一部と見なします。

awk -F'[ {}]+' '{printf("-%s %s + %s ;\n", $2, $5, $4)}'

printf置換を使用すると、print文字列形式を表示しやすくなりますが、print "-"$2,$5" + "$4";"置換を使用する場合はprintf("-%s %s + %s ;\n", $2, $5, $4)これがオプションです。

関連情報