• 締切済み

gawkでのタブ出力

gawkで、1行に2つのカラムに分けて出力をしようとして、 print "foo", "bar"; と書くと、結果は、 foo bar というように、foo と bar の間にスペースが何個か入ってしまいました。 この出力を cut -f2 のようにして特定のカラムを取り出したり、Excelに直接貼り付けたり(タブ区切りは貼り付けが便利です)したいので、 スペースでカラムの縦がそろうだけでは意味がなく、タブが入ってほしいのです。 print "foo" "\t" "bar"; と、明示的にタブを指定しても同じ結果でした。 gawkでタブを出力するには、どうすればよいのでしょう?

みんなの回答

回答No.2

printで駄目なら、フォーマット付きのprintfにして printf("foo\tbar\n"); やら printf("%s\t%s\n","foo","bar"); という具合にすれば大丈夫じゃないかと思いますが。 書式を整えたいときは多少面倒でも、printfを使う方が手堅いと思いますよ。

toshi1112
質問者

お礼

ご回答ありがとうございます。 万能ですね。 うまくいきました。

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

>print "foo" "\t" "bar"; でいいです。もしくは、OFS="\t" しておいて、print "foo","bar" >と、明示的にタブを指定しても同じ結果でした。 どこかに間違いがあると思いますが、情報が不足しています。bashからの起動だとして、 gawk 'BEGIN{ print "foo" "\t" "bar"}' でもダメですか?

toshi1112
質問者

お礼

ご回答ありがとうございます。 今日やってみたら、うまくいきました。 (もちろん、ご回答いただきました方法でも成功しました) 質問時には、同じスクリプトなのに、何回やっても勝手にスペースに変わってたんですが・・ 環境は、Windows用 Gnu Awk (gawk) 2.15, patchlevel 4 + multi-byte extension 1.03 です。 (質問にも書きましたが、Excelといっしょに使いたいので。)

関連するQ&A

  • awkのgsubによる置換

    awkのgsubで置換をしているのですが、置換後、全体をprintするため $0で出力したところ、セパレータがカンマ区切りから半角スペースに なってしまいます。 置換されなかった場合は、何事もなくそのまま出力されます。 これは、そのようなものなのでしょうか もし、カンマ区切りで出力したい場合は、ループなどで繰り返して 出す以外ないのでしょうか gawk -F"," '{if ($5=="1") {gsub($2,'abc',$2); print $0} else {print $0}}' hoge.txt

  • エクセルから タブ区切りTXTファイルへの

    エクセルから タブ区切り TXTファイル を 作りたいのですが 上のメニューバーには 取り込みはあるんですが、出力なる ところが 見つかりません。 何かの見落としかと思うのですが よろしくどうぞ

  • テキストでタブを検索してスペースに置換したいのですが

    パソコン初心者です。 エクセルで作ったデータをコピーしてテキスト(.txt)に貼り付けるとエクセルの列の区切りがタブに置き換わります。このタブをスペースに置き換えたい(検索・置換)のですが、タブをどのように検索してよいのか分かりません。 エクセルの列のデータ間がスペースになれば検索・置換でなくてもよいのですが(例えばテキストの貼り付けの際にひと手間加える等)、 どなたかご存知の方にご教示いただきたく質問いたしました。 お忙しい中、申し訳ございませんが、急ぎでお知らせ頂けると幸いです。よろしくお願い致します。

  • unixのawkについて

    unixでawkを使ってフルパスからディレクトリとファイル名に分けようと しているのですが、上手くいきません。 例えば ①/aaa/bbb/ccc ②/111/222/333/hoge.txt ③/hoge/foo/bar/dk@0:1 を ①/aaa/bbb と ccc ②/111/222/333 と hoge.txt ③/hoge/foo/bar と dk@0:1 としたいのです。 echo "/111/222/333/hoge.txt" | gawk '{sub(/\/.*$/,"",$0); print}' としてみたのですが、 ディレクトリだけを取り出そうとしたのですが上手くいきません。 よろしくお願いします。 OSは、Solaris、Linuxになります。

  • awkによるあるプログラムその2

    立て続けに申し訳ないですが、 次のプログラムを実行すると、 gawk: ./test.awk:19: fatal: function name `foo' previously defined というエラーになってしまいます。 なぜでしょうか? #!/usr/bin/gawk -f #test.awk: BEGIN{ a="OK"; b="OK"; c="OK"; print foo(1,2); print a,b,c; print bar("AWK is", "convenient"); print a,b,c; print "4!==" recursive(4); } function foo(a,b, c){ c=a+b; return c; } function foo(a,b, c){ c=a b; return c; } function recursive(a){ if(a<=1)return 1; else return a*recursive(a-1); }

  • シェルからSQLのPROMPTコマンド出力結果をそのまま出力したい(半角スペースがTABになる)

    Linux(RHEL5)を構築し、以下のようなテストスクリプトを作成しました。 その際に、PROMPT分にて出力した半角スペースが、一部タブに置き換わってしまい、こちらを、空白のまま表示させる方法について、ご教授頂けますと幸いです。 構成 test.shから、testsql.sqlを実行し、プロンプト出力を行う。 test.sh 内容 #!/bin/bash splplus /nolog conn / as sysdba; @testsql.sql testsql.sql 内容 PROMPT ##              ## PROMPT ##     TEST     ## PROMPT ##              ## ●実行コマンド sh ./test.sh >test.log ●結果 ・vi test.log にて、##と##の間の半角スペースが一部タブになる (投稿時は、閲覧のしやすさのため全角スペースで記載しています) ・出力結果をバイナリ転送にて、Windowsに転送、 テキストエディタで表示してもタブになっています。 文字コードを色々変えたり、SCRIPTコマンドでの実行で上手くいくかも と思ったのですが、やはりダメでした・・よろしくお願いします

  • Java のinstanceof 演算子について

    Sun Java2 認定ガイドの168 ページに次のコードを前提とした場合のinstanceof テスト結果が示されている。 このようなテスト結果が得られるプログラムのコーディングを教えてください。 *前提とするコード interface Face { } class Bar implements Face { } class Foo extends Bar { } *instanceof 演算子のオペランドとテスト結果(表) 1番目のオペランド  instanceof オペランド      テスト結果 null        すべてのclass型又はinterface型    false Fooインスタンス   Foo、Bar、Face、Object        true Barインスタンス   Bar、Face、Object           true Barインスタンス   Foo                  false Foo[]        Foo、Bar、Face            false Foo[]        Object                true Foo[1]        Foo、Bar、Face、Object        true 以上です。例えば、2行目のFooインスタンスとBarの比較は次のようにやればよいと思いますが、Foo[]やFoo[1]についてはどうコーディングすればよいのでしょうか? Foo f = new Foo(); boolean b = f instanceof Bar; // bをプリントする     

  • 【UNIX】echoコマンドのタブがずれる

    solaris環境(SunOS 5.10)で日本語を含む文字列を標準出力させた際に、タブの位置が1バイト分後ろにずれてしまいます。 ◼︎コマンド (1)echo ”あ¥ta” (2)echo ”aa¥ta” ◼︎出力結果 ※スマホから入力しているため、空白を△として表記させて頂きます。 どちらもタブ一つ分の入力しかしていません。 (1)あ△△△△△a (2)aa△△△△a (1)について、出力結果が想定より1バイト分後ろにずれて出力される。 (2)の位置からaが始まるのが理想なのですが、原因などわからないでしょうか。 実際にやりたいのは、日本語とタブを複数含む文字列を標準出力させた後、日本語を含まない複数のタブを含む文字列を何行か標準出力させて、区切り位置を綺麗に見せたいです。 全然関係ないかもしれないですが、環境変数は下記のようになっています。 LANG=ja_JP.PCK SHELL=/sbin/sh 宜しくお願い致します。

  • VBAで””なしのタブ区切りで出力する方法

    エクセルのデータをタブ区切りで出力したいのですが、「ファイル名を付けて保存」から「ファイルの種類」をタブ区切りにして保存した場合、カンマが含まれるセルにダブルクォーテーション「””」が付与されてしまいます。 やりたいことは以下の3つになります。 1.タブ区切りで出力する 2.カンマが含まれていてもダブルクォーテーションで括らない 3.先頭2行(1行目と2行目)を削除 ※1行目はタイトル行、2行目はサンプル行です。 1と2を満たすVBAはできたのですが、3を実現するために以下の 処理を加えたところ、正しくタブ区切りで出力されなくなってしまいました。 ・アクティブシートをコピー ・1~2行目を削除 ・コピーしたシートを削除 作成したVBAは以下になります。 ーーーーーーーここからーーーーーーーーーーーー Option Explicit Public Sub ChangeTSV() Dim FileName As String FileName = WriteTsvFile(ActiveSheet) If FileName <> "" Then MsgBox "タブ区切りテキストファイルが作成されました。" & vbCrLf & "[PATH]" & vbCrLf & FileName, vbInformation, "タブ区切りテキストファイル作成完了" End If End Sub Private Function WriteTsvFile(TargetSheet As Worksheet) As String On Error GoTo WriteTabTxtFileErr Dim FileName As String Dim LastRow As Long Dim LastCol As Long Dim レコード As String Dim c As Variant Dim i As Long Dim FileNo As Integer ' アクティブシートをコピー ActiveSheet.Copy After:=Worksheets("最後のシート名") ' 1~2行目を削除 Range("1:2").Delete ' ファイル名を作成 FileName = Application.ThisWorkbook.Path & "\" & TargetSheet.Name & "_" & Format(Now, "yyyymmdd-hhmmss") & ".txt" FileNo = FreeFile() ' 最終行と最終列の取得 LastRow = Cells(Rows.Count, 1).End(xlUp).Row LastCol = Cells(1, Columns.Count).End(xlToLeft).Column i = 1 Open FileName For Output As #FileNo ' アラートOFF Application.DisplayAlerts = False Do Until i > LastRow For Each c In Cells(i, 1).Resize(, LastCol) レコード = レコード & vbTab & c.Value Next c Print #FileNo, Mid$(レコード, 2) レコード = "" i = i + 1 Loop Close #FileNo ' コピーしたシートを削除 ActiveSheet.Delete ' アラートON Application.DisplayAlerts = True WriteTsvFile = FileName Exit Function WriteTabTxtFileErr: MsgBox "[WriteTabTxtFile]" & vbCrLf & TargetSheet.Name & vbCrLf & Err.Description, vbCritical, "Exception" WriteTsvFile = "" Exit Function End Function ーーーーーーーここまでーーーーーーーーーーーー タイトル行およびサンプル行を削除してから処理を行っているため、 どこまでがデータが入るべき列なのか判断できずに空白列にタブが入らないのは当たり前なのですが、 これを回避する方法がまったくわからず困っております。 お知恵をお貸しください。

  • unixコマンドについて

    ユニークカウント uniq -c とすると、 カウント数<スペース>カウント対象物 例)  10 ○○△△   9 ○□ ・・・ というデザインで出力されると思いますが、 この カウント数とカウント対象物の間のスペースをタブ区切りに変更するもっとも簡単なコマンドを教えてください。 なお、カウント対象物の中にもスペースが含まれており、そのスペースはタブ区切りにしたくはないので、あくまでも、カウント数とカウント対象物の間だけを変換したいのです。 よろしくお願いいたします。

専門家に質問してみよう