まあ、これは複雑な質問なので、明確に説明します。私が取得するファイルの内容は次のとおりです。
$ 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
次に、内部のデータをデータに置き換えますFile4
(File3
角かっこなしのデータは「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)
これがオプションです。