• ベストアンサー

awkで列指定をして削除

awkかsedを利用して以下のファイルを処理したいです。 1 2 3 4 5 2 1 3 4 5 1 2 3 4 5 3 1 3 4 5 一列目の値が1の行のみ削除したいです。 2 1 3 4 5 3 1 3 4 5 こんな感じです。 実際に処理するファイルは膨大な行数ががあるためprintでは難しいです。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.2

No1さんの回答だと、「行頭の文字が1の行を除外」なので、質問とはちょっと違うような。 awk '$1!="1" ' 元ファイル > 修正後ファイル

macdoc
質問者

お礼

ありがとうございます。 awkで「!」の使い方を初めて知りました。

その他の回答 (2)

  • dscripty
  • ベストアンサー率51% (166/325)
回答No.3

[ANo.2] さんが awk だから sed で! sed '/^[ \t]*1[ \t]/d /^[ \t]*1$/d' 元ファイル > 修正後ファイル sed の正規表現って表現力乏しい。。。

macdoc
質問者

お礼

ありがとうございます。

回答No.1

該当行を削除した状態を別ファイルに出力するなら以下のコマンドでできます。 # awk '$1 !~/^1/{print}' input_file > output_file コマンドを毎回打つのがめんどい場合はawkの構文をファイル(hoge.awk)に書いて以下で実行 # awk -f hoge.awk input_file > output_file これで答えになってるでしょうか? 因みに以下のようにgrepコマンドでも同じことができますが入力ファイルの行数が数万行以上とかの場合はawkの方が早いと思います。 # grep -v ^1 input_file

関連するQ&A

  • awkについて

    awkの勉強を始めました。入力ファイルから特定の行を抜き出し、平均値を求めようとしています。しかし、FNRとはファイルの全行のようで、FNRで割ると正しい値になりません。特定の文字($8="abc")の行だけ抜き出しているので行数は全体より小さいのですが、抜き出した行数で割るにはどうすればよいのでしょうか。

  • awkで特定の範囲の行を削除したい

    awkなどの使い方がよくわからないので教えてください。 あるテキストファイル中の、"del_start" という文字が入った行から"del_end" という文字が入った行までの全ての行を削除したファイルを作るシェルを作成したいと思っています。 awk(やsed、grep、cat ?)などを使って実現するにはどうすればいいのでしょうか? よろしくお願いします。

  • awkでデリミタを変更したいです。

    以下のファイルtestを 1111:2222:3333:4444 5555:6666:7777:8888 ↓ 1111,2222,3333,4444 5555,6666,7777,8888 にしてみたいです。 awk -F":" 'BEGIN{OFS=","}{ print }' test などとためしてみたのですがうまくいきません。 ご教示下さい。内容はsedですぐできるんですね、、。

  • awkで単語単位での置換

    awkを使って単語単位の置換を行いたいのですが、うまく行きません。 awkで単語単位で置換を行うのにはどの様にすれば宜しいのでしょうか? 何方かご存知の方いらっしゃいましたらご教授願います。 具体的にはsedの以下のコマンドと同等の事をawkで行いたいと思っています。 sed 's/\b置換前の単語\b/置換後の単語/g' 例: ・ファイルの内容 hogehoge abcdefg hogehoge hogehoge bcdef hogehoge hogehoge bcd hogehoge hogehoge abcd hogehoge hogehoge bcd hogehoge bcdef bcd hogehoge 上記ファイルをawkで1行ずつ読み込みの3,5,7行目の”bcd”のみ”HIJ”に置き換える事をしたいと考えています。 下記を試してみたのですが、うまく行きませんでした。 1.awk '{gsub(/\bbcd\b/, "HIJ", $0); print $0}' 2.awk '{gsub(/(bcd)/, "HIJ", $0); print $0}' 1だと全く置換されず、2だと3,5,7行目以外も置換されてしまいます。 どの様にしたらうまく行くのでしょうか?

  • awkとsedはセットで覚えたほうがいいですか?

    仕事でときおりテキストファイルを加工することがあります。 最近awkを初めて使い簡単に処理できることが実感できました。 awkの本を探して調べていたら、「sed & awkプログラミング 改訂版」 を発見し、タイトルにsedとawkとあるので、"awkとsedはセット"なのかと かんじました。 awkを勉強するならsedも一緒に覚えたほうがいいのでしょうか?

  • awkのセパレータ指定について

    awkのセパレータ指定について教えてください。 以下のようなファイルがありそれを'||'区切りで出力したいです。 下記のような指定をしてみたのですが、 うまくいきませんでした。 cat text | awk -F '||' '{print $1}' [test.txt] aaa||bbb||ccc [期待する結果] print $1 → aaa print $2 → bbb print $3 → ccc どなたか教えてください。 よろしくお願いします。

  • awk の使い方

    sample.txt ファイルには   "中村" "08/01/80" "03.1234.5678"   "木村" "08/01/81" "06.1252.2536" のような情報があります。 そこの3番フィールドが電話番号ですので、awkで検索しようと思っています。 それで、 awk -v ARGU="$NUM" ' { VAR=substr($3,2,(length($3)-2)) if ( ARGU == VAR ) {print} }' /sample.txt のようにして、検索をかけようとしましたが、できません。 どこが間違っているのか教えてください。 awkの他の方法があるとか、違うもの(sed or grep)でできるのであれば、お願いします。

  • [awk]2つのファイルを参照して1つのファイルに出力する方法

    最近プログラミング(シェル、awk)を始めた者です。 かなり大まかなものは作れるようになったのですが、急遽、大規模なデータ整理を行わないといけなくなってしまったため、皆さんの知恵を貸していただきたく質問いたしましたm(_ _)m 以下に示すような2つのファイルがあります。 (file1)         (file2) 1 6           1  1  2  10 11 2 3           2  3  5  7  8 3 5           3  6  2  12 13 4 1           4  9  4  5  19 5 2           5  10 19 1  5 6 4           6  4  8  2  9 file1を上から1行ずつ順に読んでいき、2列目の値と同じものをfile2の1列目から探します。合致したところで、file2の合致した行の2列目以降を行番号を付けて表示するというものです。 (「file1の2列目の値=file2の1列目の値」を探し、file2の合致行の値を出力。) 上記ファイルですと、結果的に 1  4  8  2  9 2  6  2  12 13 3  10 19 1  5 4  1  2  10 11 5  3  5  7  8 6  9  4  5  19 という具合になります。 2つのファイルの行数は同じではなく、また、両ファイルとも1列目が行番号というだけで、他の列の値に規則性はありません。 file2の行数は100万以上の大規模なものになります。 自分が作ったものを掲載できればよかったのですが、あいにく会社のPC内にありまして、持ち出しできないため、掲載できません。 動作環境はLinux(RedHat)になります。 他のプログラミング言語についてはまだ分からないため、awkもしくはシェルでお願いいたします。

  • sed,awkでのデータ抽出方法

    教えてください。 awk,sed,シェルを使い、カンマ区切りのファイルの1カラム目と2カラム目をキーに、 あるファイルに含まれる行を削除するにはどうすればよいのでしょうか? 例) --aaa.csv-- 111,222,333,444 555,666,777,888 999,000,111,222 --file1.txt-- 111222 555666 の場合、aaa.csvより下記行のみほしい。 999,000,111,222 ご存知でしたら、ご教授ください。 よろしくお願いします。

  • awkでのsh処理について

    HP-UX環境、UNIXです。 1行目の11カラム目にOUTが含まれているかつ2行目の11カラム目にINが含まれている行だけ ファイルに出力するという処理を以下のように考えたんですが、うまくいきません。 awk'{m == NR % 2} m==1{if($11~ "OUT")} && m==0{if($11~ "IN") print $0} ' [ファイル名] 文法的に誤っていますでしょうか?? 回答宜しくお願い致します。

    • ベストアンサー
    • CGI

専門家に質問してみよう