コマンド出力から4番目の列のすべての文字列値を取得する最速の方法

コマンド出力から4番目の列のすべての文字列値を取得する最速の方法
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

https://docs.raku.org/言語/regexes#\t_and_\T
https://raku.org

関連情報