Item Name Data Price Comment
shoes Nike 20 Expensive item
pencil Cheap price
bag Most expensive
目標は、2列と3列のタブ情報を考慮して4列の値を取得することです。
を使用するとawk '{print $4,$5}'
予想される出力が得られますが、2行目でこれを行うとデータが正しくありません。
答え1
データがタブで区切られていて、4番目の列が必要な場合は、次のcut
オプションと組み合わせて使用してください-f 4
。
cut -f 4 file
このcut
ユーティリティは、タブ文字をデフォルトの区切り文字として使用します。
コマンドawk
で使用されるデフォルトのフィールド区切り文字awk
は、連続したスペース(タブまたはスペース)です。を使用して、-F '\t'
入力フィールド区切り文字をawk
タブに変更できます。awk
上記のコマンドと同じことを行う方法を確認してください。cut
awk -F '\t' '{ print $4 }' file
Miller()などのわずかに「高度な」TSV認識ツールを使用すると、名前mlr
で列のアドレスを指定することもできます。
mlr --tsv cut -f Comment file
これはデータをTSV(「Tab Separated Values」)に読み込み、Comment
各入力レコード(行)のフィールドを抽出します。
(「TSV認識」は、引用されたフィールドを介して追加の助けなしにawk
実行できないCSVファイルと同様に、そのフィールドにタブと改行を含めることができることを知っています。)
答え2
使用幸せ(以前のPerl_6)
正規表現があなたの友達だという言葉から始めましょう。実際には5つではなく4つの列がありますか? 1)タイトル/本文「単語の間隔」をアンダースコアに変換し、2)タブをカンマまたはパイプに変換(または他の適切な置換:)して、列をすばやく可視化できます。
~$ raku -pe 's:g/\x0020/_/;' < file > tmp1
~$ cat tmp1
Item_Name Data Price Comment
shoes Nike 20 Expensive_item
pencil Cheap_price
bag Most_expensive
#それから:
~$ raku -pe 's:g/\t/|/;' < file > tmp2
~$ cat tmp2
Item_Name|Data|Price|Comment|
shoes|Nike|20|Expensive_item
pencil|||Cheap_price
bag|||Most_expensive
実際、4番目の列(0インデックス= 3)を抽出するために、この時点のコードは次のように単純化されます。
~$ raku -ne 'put .split("|").[3] // "";' tmp2
上記のコードは空行を保持します。空行を削除するには、次のコマンドを使用します。
~$ raku -ne '.put with .split("|").[3];' tmp2
正しい列があると確信している場合は、最初から元のファイルに上記のコードをパラメータ.split("\t")
(例:分割onなど)を使用して実行してくださいtab
。
出力例(オリジナルファイル、分割\t
):
Comment
Expensive item
Cheap price
Most expensive