タグ付けされた質問 「awk」

パターン指向のスキャンおよび処理言語。

4
一致するフィールドに基づいて列のペアを合計する
次の形式の大きなファイルがあります。 2 1019 0 12 2 1019 3 0 2 1021 0 2 2 1021 2 0 2 1022 4 5 2 1030 0 1 2 1030 5 0 2 1031 4 4 列2の値が一致する場合、両方の行の列3と4の値を合計します。それ以外の場合は、一意の行の値の合計のみです。 したがって、私が期待している出力は次のようになります。 2 1019 15 2 1021 4 2 1022 9 2 1030 6 2 1031 8 …

2
大きなCSVファイルのインデックスを再作成する
私はこの役立つスレッドで回答を調べましたが、私の問題は十分に異なっているようです(少なくともでsed)。 次のような行を含む大きなCSVファイル(200 GB以上)があります。 <alphanumerical_identifier>,<number> どこ<alphanumerical_identifier>ファイル全体にわたって一意です。最初の列をインデックスで置き換える別のファイルを作成したい、つまり <index>,<number> 私たちが得るように: 1, <number> 2, <number> 3, <number> awkメモリ内のファイル全体を読み込まなくても、増加するインデックスを生成できますか? インデックスは単調に増加するため、単にインデックスを削除する方が良い場合があります。そのための解決策はそれとは異なりますか?すなわち: <number> <number> <number>
11 files  sed  awk  csv 

6
2つのファイルの違いを出力するにはどうすればよいですか?
私のファイルは以下で構成されています。おおよそ: username:username:username:username:username 上記の行は約600文字まで続きます。 awkコマンドラインから送信されたAPI / HTTPリクエストの引数として使用するために、コマンドを使用します。 私のスクリプトを使用して、「フォロー」しているユーザーアカウントのリストを取得し、24時間ごとに、ハードディスクの元のリストと新しく出力されたユーザー名のリストを比較します(そして、フォローしていないユーザーをエコーします)私。bashを使用してロジックをループにカプセル化する必要があります。各ユーザー名をテストします。 私の現在のスクリプト: user=$(awk -F: '{ print $1 }' FILE) # Grab $User to use as an argument. following=$(exec CURRENT_FOLLOWERS) # Outputs the new file echo "X amount of users are following you on 78B066B87AF16A412556458AC85EFEF66155" SAVE CURRENT FOLLOWERS TO NEW A FILE. if [[ DIFFERENCE …

3
1回のパスで複数の文字列を置き換える
テンプレートファイルのプレースホルダー文字列を、一般的なUnixツール(bash、sed、awk、perlなど)で具体的な値に置き換える方法を探しています。交換が1回のパスで行われることが重要です。つまり、すでにスキャン/交換されたものを別の交換と見なしてはなりません。たとえば、次の2つの試みは失敗します。 echo "AB" | awk '{gsub("A","B");gsub("B","A");print}' >> AA echo "AB" | sed 's/A/B/g;s/B/A/g' >> AA この場合の正しい結果はもちろんBAです。 一般に、ソリューションは、入力を左から右にスキャンして、指定された置換文字列の1つとの最長一致を検索し、各一致について置換を実行して、入力のそのポイントから続行することと同等でなければなりません(すでに読み込まれた入力も、実行された置換も一致と見なされます)。実際、詳細は関係ありません。置換の結果が全体または一部が別の置換の対象になることはありません。 注私は正しい一般的なソリューションのみを探しています。特定の入力(入力ファイル、検索および置換ペア)で失敗するソリューションを提案しないでください。
11 bash  sed  awk  string  replace 

9
文字列で最も長い数値を出力するにはどうすればよいですか?
文字列で最も長い数値を出力する方法を探しています。 例:文字列がある場合 212334123434test233 どうやって印刷できますか 212334123434 ? 注:数値的に大きな値ではなく、最も長い連続した数列を探しています。 編集:皆さん、答えてくれてありがとう。この質問への回答は非常に圧倒されています。@HaukeLagingの投稿は、私の特定のケースに非常に適しているため、承認済みの回答としてマークしましたが、すべての回答が等しく有効であることを指摘しておきます。問題を解決するためのいくつかの異なるオプションがあることは常に素晴らしいことです。

3
awkを使用して最後の行を最初に処理する
awk最後のデータポイントに基づいて、を使用して正規化するデータファイルがあります。そのため、私は最初に最後のデータポイントにアクセスし、データを正規化してから、正常に処理したいと考えています。 次の方法は、tac2回使用するとうまくいきますが、おそらく必要以上に複雑です。 $ cat file 0 5 1 2 2 3 3 4 $ tac file | awk 'NR==1{norm=$2} {print $1, $2/norm}' | tac 0 1.25 1 0.5 2 0.75 3 1 私の質問は次のとおりです。awkのみを使用して上記の結果を取得することは可能ですか? 答えは「いいえ、awkはファイルを1行ずつスキャンします」と思いますが、代わりの方法を提案します。

2
awk高精度演算
私はawkに高精度の算術演算を代入演算で行うように指示する方法を探しています。これには、ファイルからフィールドを読み取り、その値を1%の増分で置き換えることが含まれます。しかし、私はそこで精度を失っています。これは問題の簡単な再現です: $ echo 0.4970436865354813 | awk '{gsub($1, $1*1.1)}; {print}' 0.546748 ここでは、小数点以下16桁の精度がありますが、awkでは6桁しかありません。printfを使用しても、同じ結果が得られます。 $ echo 0.4970436865354813 | awk '{gsub($1, $1*1.1)}; {printf("%.16G\n", $1)}' 0.546748 希望する精度を得る方法について何か提案はありますか?

12
空の行を削除するためにテキストファイルをフィルタリングする良い方法は何ですか?
空の行がたくさんある(Macの).csvファイルがあります。例: "1", "2", "lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum ","2","3","4" "1", "2", "lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum …

5
順序を維持しながら隣接する重複行を削除する
それぞれが何回も繰り返される名前が1列のファイルがあります。同じ名前の他の繰り返しに隣接していない同じ名前の他の繰り返しを維持しながら、各繰り返しを1つに圧縮したい。 例えば、私は左側を右側に向けたいです: Golgb1 Golgb1 Golgb1 Akna Golgb1 Spata20 Golgb1 Golgb1 Golgb1 Akna Akna Akna Akna Spata20 Spata20 Spata20 Golgb1 Golgb1 Golgb1 Akna Akna Akna これは私が使用してきたものです。perl -ne 'print if ++$k{$_}==1' file.txt > file2.txt ただし、この方法では左から1つの代表のみが保持されます(つまり、Golb1とAknaは繰り返されません)。 複数の隣接しないブロックで繰り返される名前を維持しながら、各ブロックの一意の名前を維持する方法はありますか?
11 awk  sed  sort  uniq 

3
特定の文字列で始まる列を出力する
次のようなファイルがあります。 ID101 G T freq=.5 nonetype ANC=.1 addinfor ID102 A T freq=.3 ANC=.01 addinfor ID102 A T freq=.01 type=1 ALT=0.022 ANC=.02 addinfor ご覧のように、各行にはわずかに異なる数の列があります。具体的には、列1、列2、列3、列4、および次で始まる列が必要です。ANC= 望ましい出力: ID101 G T freq=.5 ANC=.1 ID102 A T freq=.3 ANC=.01 ID102 A T freq=.01 ANC=.02 私は通常、awkコマンドを使用してファイルを解析します。 awk 'BEGIN {OFS = "\t"} {print $1, $2, $3, $4}' …

8
テキストファイルを固定数の単語を含む行に分割する
関連していますが、満足のいく答えはありません。大きなテキストファイルを500ワード程度のチャンクに分割するにはどうすればよいですか。 私は、1行に10 ^ 7ワードを超えるテキストファイル(http://mattmahoney.net/dc/text8.zip)を取得し、それをそれぞれNワードの行に分割しようとしています。私の現在のアプローチは機能しますが、かなり遅くて醜いです(シェルスクリプトを使用)。 i=0 for word in $(sed -e 's/\s\+/\n/g' input.txt) do echo -n "${word} " > output.txt let "i=i+1" if [ "$i" -eq "1000" ] then echo > output.txt let "i=0" fi done これをより速く、またはよりコンパクトにするためのヒントはありますか?

5
シェルを使用してMACアドレスからIPv6アドレスを取得する方法
MACアドレスを使用して、たとえばネットワーク内で一意である必要があるリンクローカルIPv6アドレスなどのインターフェイス識別子を作成できることはわかっています。 画像はこれを行う方法を示しています: 私の質問は: awkまたはを使用してMACからIPv6アドレスを作成するにはどうすればよいsedですか? または、特定のMAC(そのようなものcreateIPv6 myMAC)のリンクローカルIPv6アドレスを取得するコマンドはありますか?
11 sed  awk  ipv6  mac-address 

2
列が一致する2つのファイルを結合する
File1.txt id No gi|371443199|gb|JH556661.1| 7907290 gi|371443198|gb|JH556662.1| 7573913 gi|371443197|gb|JH556663.1| 7384412 gi|371440577|gb|JH559283.1| 6931777 File2.txt id P R S gi|367088741|gb|AGAJ01056324.1| 5 5 0 gi|371443198|gb|JH556662.1| 2 2 0 gi|367090281|gb|AGAJ01054784.1| 4 4 0 gi|371440577|gb|JH559283.1| 21 19 2 output.txt id P R S NO gi|371443198|gb|JH556662.1| 2 2 0 7573913 gi|371440577|gb|JH559283.1| 21 19 2 6931777 File1.txtには2つの列があり、File2.txtには4つの列があります。一意のIDを持つ2つのファイル(array [1]は両方のファイル(file1.txtとfile2.txt)で一致する必要があります)を結合し、一致したIDのみを出力したい(output.txtを参照)。 …
11 awk  join 

3
パイプラインでの複数のtrプロセスを回避するために、trコマンドをチェーン化できますか?
私はたくさんのtxtファイルを持っています。それらを小文字で、アルファベットと1行につき1ワードだけ出力したいのですが、次のようなtrパイプラインでいくつかのコマンドを使用して実行できます。 tr -d '[:punct:]' <doyle_sherlock_holmes.txt | tr '[:upper:]' '[:lower:]' | tr ' ' '\n' これを1回のスキャンで実行することは可能ですか?私はこれを行うには、Cプログラムを書くことができますが、私は感じて使用してそれを行う方法がありますようにtr、sed、awkまたはperl。
11 sed  awk  perl  tr 

2
awkを使用してインプレースでファイルを変更する方法は?(「sed -i」と同様)
私はawkスクリプトがありますnew.awk: BEGIN { FS=OFS="," } NR==1 { for (i=1; i<=NF; i++) { f[$i] = i } } NR > 1 { begSecs= mktime(gensub(/[":-]/," ","g",$(f["DateTime"]))) endSecs = begSecs + $(f["TotalDuration"]) $(f["CallEndTime"]) = strftime("%Y-%m-%d %H:%M:%S", endSecs) } { print } 私はこれをシェルで呼び出しています awk new.awk sample.csv ...しかし、ターミナルの変化を見ることができます。使用する場合のように、ファイル内の変更をインプレースにする方法はsed -i?
11 linux  shell  awk 

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