2017-05-17 5 views
0

2行にタブ区切りのファイルを作成しました。なぜawkは自分のタブを検出しないのですか?

mac$ cat tab_sep_file.tsv 
1 2 3 
4 5 6 

実際のタブまたはスペースですか、お聞きします。はい、彼らは本物のタブです:

mac$ python 
Python 2.7.10 (default, Jul 14 2015, 19:46:27) 
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> 
>>> with open('tab_sep_file.tsv') as f: 
...  a = f.read() 
... 
>>> print repr(a) 
'1\t2\t3\n4\t5\t6\n\n' 
>>> 

はなぜこの仕事をするのは、単一の列

mac$ cat tab_sep_file.tsv | awk -F "\t" "{print $1}" 
1 2 3 
4 5 6 

をプリントアウトしてみましょうか? 私はいくつかのTSVでこれをテストしました

+0

の可能性のある重複した[awkは、単一または二重引用符の使用状況](http://stackoverflow.com/questions/23908267/awk-single-or-double-quote-usage) – mklement0

+2

これはAWKとは何の関係もありませんそれはシェルの問題です。通常のシェル引用規則に従います - 特定の目的のために**二重引用符を必要としない限り、一重引用符を使用してください。そして、二重引用符を使用すると、他の目的のために二重引用符は不要です**。シェルスクリプトで歌う、二重にする、引用しない、という違いを学びましょう。 –

答えて

1

'{print $1}'のようなAwk式では、一重引用符を使用してください。二重引用符を使用すると、$1がnullになります。

また、空白(スペースとタブ)がデフォルトでフィールド区切り文字の場合は、-Fオプションを使用する必要はありません。

1

印刷文を一重引用符で囲みます。

echo $'a\tb' | awk -F "\t" '{print $1}' 

技術的にはタブセパレータは必要ありません。 awkはそれを自動的に処理します。

echo $'a\tb' | awk '{print $2}' 
関連する問題