awkに関する質問


9

わかりました、これは複雑な質問なので、はっきりと説明します。次のようなファイルのコンテンツを取得しました。

$ 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、データ(ブラケット1「のない手段のデータをFile1その1つの最後の列」)

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列のデータをファイルする)。


GNU awkを使用していますか?
123

私はuの意味がわかりません。しかし、私はawkに触れるための新しい初心者です。これは、実行する必要があるタスクです。awkの理解に基づいて、1ステップずつゆっくりと実行できるように最善を尽くします。
heng960407 2016

1
タイプawk --version、結果はどうですか?
123

2
タイトルを問題に固有の名前に変更してください。これにより、将来同じような質問を持つ他の人が見つけやすくなります。現在、「awkに関する質問」は非常に一般的です。
トムフェネック2016

回答:


16

なぜ左右にコピーしているのかわかりません。簡単なことは

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

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

間印刷

  • $2 そのままにしたいからです。
  • の部分文字列$5。最初と最後の文字を含まない文字列です。位置2から開始して最初の文字をスキップし(awkは常に奇妙でした)、元の文字よりも2文字短い部分文字列を選択するだけで、最後の文字を除外します$5
  • +我々はそれをしたいので、
  • その後 $4

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


substr(string, 2)ストリングは二番目の文字、などから始まる返しcut -c2-tail -n +2sed '2,$'...それについてとても奇妙何ですか?
ステファンChazelas

3
そのコマンドは標準でありawk、70年代のオリジナルでも動作します。
ステファンChazelas

@StéphaneChazelas:ああ、私はあなたを待っていました:-)通常、0から数え始めます。つまり、インデックス2が3番目の位置ですが、ここでは2番目の位置がインデックス2です。残りのGNUの質問を明確にしていただきありがとうございます。
Bananguin 2016

@Bananguin、上のいくつかの例に示すように、Unixシェルとユーティリティでは、0ではなく1から始めます。最も顕著な例外は、kshの配列と$ {var:offset}(どちらもbashによってコピーされます)です。他のすべてのシェル配列は1から始まります。参照Zsh配列の最初の要素が0ではなく1でインデックス付けされる理由はありますか?
ステファンChazelas

7

SED

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

そしてawkバリエーション

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

6

簡単な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マクロを使用してAwk ソリューションを音訳する:

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

フィールドはfリストにあり、インデックスはゼロベースです。


1
lispとcrytiestの外観の+1!その言語はpcg(プログラミングコードゴルフ)で競争する必要があります
Archemar

@Archemar TXRは、個々のキャラクターに機能を割り当てたり、組み合わせて作曲したりすることができるように設計された特別な言語が存在するため、ゴルフであまり競争しません。
Kaz

@Archemarエントリを入力してください:codegolf.stackexchange.com/questions/68712/output-the-next-kana
Kaz

1
@Kaz TXRチュートリアルはどこにありますか?マニュアルページはかなり巨大に見えます。awkと比較してどのように機能しますか?
bli

1
@bli GNU Awkのは、いくつかの220+ラインでTXRのAWKマクロ、より大きなファイルを介して高速の基本的なフィールド分割で少なくとも30倍のようなものである と解釈コードレコードとフィールドに入力ソースを処理するための全体的なループを含みます。
Kaz 2016

3

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

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

printf代わりにを使用printすると、文字列がどのようにフォーマットされるかが少しわかりやすくなりますが、の代わりに使用したい場合print "-"$2,$5" + "$4";"printf("-%s %s + %s ;\n", $2, $5, $4)、それを選択できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.