- 締切済み
gawkでのタブ出力
gawkで、1行に2つのカラムに分けて出力をしようとして、 print "foo", "bar"; と書くと、結果は、 foo bar というように、foo と bar の間にスペースが何個か入ってしまいました。 この出力を cut -f2 のようにして特定のカラムを取り出したり、Excelに直接貼り付けたり(タブ区切りは貼り付けが便利です)したいので、 スペースでカラムの縦がそろうだけでは意味がなく、タブが入ってほしいのです。 print "foo" "\t" "bar"; と、明示的にタブを指定しても同じ結果でした。 gawkでタブを出力するには、どうすればよいのでしょう?
- toshi1112
- お礼率100% (3/3)
- その他(プログラミング・開発)
- 回答数2
- ありがとう数3
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- maccha_neko
- ベストアンサー率33% (465/1379)
printで駄目なら、フォーマット付きのprintfにして printf("foo\tbar\n"); やら printf("%s\t%s\n","foo","bar"); という具合にすれば大丈夫じゃないかと思いますが。 書式を整えたいときは多少面倒でも、printfを使う方が手堅いと思いますよ。
- notnot
- ベストアンサー率47% (4848/10262)
>print "foo" "\t" "bar"; でいいです。もしくは、OFS="\t" しておいて、print "foo","bar" >と、明示的にタブを指定しても同じ結果でした。 どこかに間違いがあると思いますが、情報が不足しています。bashからの起動だとして、 gawk 'BEGIN{ print "foo" "\t" "bar"}' でもダメですか?
お礼
ご回答ありがとうございます。 今日やってみたら、うまくいきました。 (もちろん、ご回答いただきました方法でも成功しました) 質問時には、同じスクリプトなのに、何回やっても勝手にスペースに変わってたんですが・・ 環境は、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
- ベストアンサー
- Solaris系OS
- エクセルから タブ区切り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になります。
- ベストアンサー
- Solaris系OS
- 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コマンドでの実行で上手くいくかも と思ったのですが、やはりダメでした・・よろしくお願いします
- ベストアンサー
- Linux系OS
- 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 宜しくお願い致します。
- 締切済み
- Solaris系OS
- 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 ○□ ・・・ というデザインで出力されると思いますが、 この カウント数とカウント対象物の間のスペースをタブ区切りに変更するもっとも簡単なコマンドを教えてください。 なお、カウント対象物の中にもスペースが含まれており、そのスペースはタブ区切りにしたくはないので、あくまでも、カウント数とカウント対象物の間だけを変換したいのです。 よろしくお願いいたします。
- ベストアンサー
- その他(プログラミング・開発)
お礼
ご回答ありがとうございます。 万能ですね。 うまくいきました。