数値のみを含む列を削除

数値のみを含む列を削除

一部のデータを含むテーブルがあり、数字(Nr。、Cod、Tiraj)のみを含む列を削除する必要があります。

Nr.     Autor         Titlu        Cod     Tiraj     Tara
1    Gauss Carl   Aritmetica 1   297485   11454   Germania
2    Gauss Carl   Aritmatica 2   297484   10254   Germania
3    Gauss Carl   Aritmetica 3   297455   45872   Germania

結果は次のようになります。

Autor         Titlu         Tara
Gauss Carl   Aritmetica 1   Germania
Gauss Carl   Aritmatica 2   Germania
Gauss Carl   Aritmetica 3   Germania

列間TAB

私はこれを使ってテーブルを作成しました。

.TS
tab(@);
c c c c c c .
Nr.@Autor@Titlu@Cod@Tiraj@Tara
1@Gauss Carl@Aritmetica 1@297485@11454@Germania
2@Gauss Carl@Aritmatica 2@297484@10254@Germania
3@Gauss Carl@Aritmetica 3@297455@45872@Germania
.TE

答え1

いくつかのジャンク行があり、フィールド区切り文字として使用されるCSVデータセットから列をNR.削除Codしようとしています。Tiraj@

sed -e 1,3d -e '$d' file |
csvcut -d @ -C 'Nr.,Cod,Tiraj' |
csvformat -D @

その出力は次のとおりです。

Autor@Titlu@Tara
Gauss Carl@Aritmetica 1@Germania
Gauss Carl@Aritmatica 2@Germania
Gauss Carl@Aritmetica 3@Germania

削除された内容を再度追加し、新しいsed列数に合わせて調整し、新しいファイルに書き込みます。

{
    printf '%s\n' .TS 'tab(@);' 'l l l .'
    sed -e 1,3d -e '$d' file |
    csvcut -d @ -C 'Nr.,Cod,Tiraj' |
    csvformat -D @
    echo .TE
} >file.new

csvcutユーティリティは、csvformat以下で提供されるCSVファイルを処理するためのツールキットであるcsvkitの一部です。https://csvkit.readthedocs.io/en/latest/

最終テーブルはnroff -t file.new

初期パイプラインの出力を実行してテーブルのバリアントを取得することもできますcolumn -s @ -t

$ sed -e 1,3d -e '$d' file | csvcut -d @ -C 'Nr.,Cod,Tiraj' | csvformat -D @ | column -s @ -t
Autor       Titlu         Tara
Gauss Carl  Aritmetica 1  Germania
Gauss Carl  Aritmatica 2  Germania
Gauss Carl  Aritmetica 3  Germania

または、次のものを使用できますcsvlook

$ sed -e 1,3d -e '$d' file | csvcut -d @ -C 'Nr.,Cod,Tiraj' | csvlook
| Autor      | Titlu        | Tara     |
| ---------- | ------------ | -------- |
| Gauss Carl | Aritmetica 1 | Germania |
| Gauss Carl | Aritmatica 2 | Germania |
| Gauss Carl | Aritmetica 3 | Germania |

...あなたがどんな人なのかによって異なります。実際に出力として欲しい。

答え2

この薄暗い概念証明を試してみてください。これは、列が常に数値または数値ではないという前提に基づいています。

awk -F"\t" '
NR==1   {split($0, HDRSV)                                       # save header fields for later use
         next
        }
NR==2   {for (i=1; i<=NF; i++)  if ($i+0 != $i) PR[++IX] = i    # check if column is non-numeric and
                                                                # save col nr for print
         for (i=1; i<=IX; i++) printf "%s\t", HDRSV[PR[i]]      # print header fields
         printf ORS                                             # and line terminator
        }
        {for (i=1; i<=IX; i++) printf "%s\t", $PR[i]            # print each line´s fields
         printf ORS                                             # and line terminator
        }
' file
Autor   Titlu   Tara    
Gauss Carl  Aritmetica1 Germania    
Gauss Carl  Aritmatica2 Germania    
Gauss Carl  Aritmetica3 Germania    

答え3

使用幸せ(以前のPerl_6)

~$ cat authors.tr | raku -ne '.split( / [^ | \S] [\d+]+ %% "\@" /, :skip-empty).join("\@").put;' | raku -ne '++$ == 4 ?? .split("\@")[1,2,5].join("\@").put !! .put;' | nroff -t -Tascii

入力例:

TS
tab(@);
c c c c c c .
Nr.@Autor@Titlu@Cod@Tiraj@Tara
1@Gauss Carl@Aritmetica 1@297485@11454@Germania
2@Gauss Carl@Aritmatica 2@297484@10254@Germania
3@Gauss Carl@Aritmetica 3@297455@45872@Germania
.TE

出力例:

  Autor         Titlu         Tara
Gauss Carl   Aritmetica 1   Germania
Gauss Carl   Aritmatica 2   Germania
Gauss Carl   Aritmetica 3   Germania

authors.tr課題として、私はnroff / groffソースファイルを修正するRakuの1行コード(2行のコード:ヘッダー用とデータ列用)を書くことにしました。 1つのトリッキーな側面は、フィールド全体が数字のみで構成されていることを確認するのが難しいことです。内側(最も左側ではなく/最も右側ではない)列は間違いなく列区切り文字で囲まれていますが、端末(最も左側/最も右側)はそうではありません。

私は最終的に(少なくとも特定の列について)最初の正規表現原子があるべきであることを発見しました[^ | \S]。正規表現の残りの部分は、%%繰り返される(列別)パターンを認識するRakuの素晴らしい「修正数量子」によって処理されます[\d+]+ %% "\t"「1つ以上の列 - タブ\d+区切り、末尾タブを許可」。上記の正規表現は、前にスペースを含む列(例:columns Aritmetica 1)を除いて、数字で終わるすべての列を削除します。

しかし、実際には仕事が多すぎます。より簡単です:

  1. .3行末のピリオドを削除し、N数値列とA文字列(タイトルなし、データ)を指定するnroff / groff列形式セクションに新しい4行を挿入し、
  2. Rakuを使用してヘッダーを解析し(以下の例ではN A A N N A . 新しい行_#4として使用)
  3. 指定された列を削除しますN
~$ cat authors2.tr  |  raku -e 'my @a=lines; \
    @a[2..3] = @a[2..3]>>.comb>>.[0,2,4...*];    \
    @a[4..7].=map: *.split("\@", :skip-empty);   \
    my $n    = @a[3].grep({!/ N /}, :k ).list;   \
    @a[2]    = @a[2][ |$n.head(*-1)];  @a[3] = @a[3][ |$n];  \
    @a[4..7].=map: *.[ |$n.head(*-1)].join("\@");  .put for @a;' 

出力例(有効な nroff/groff):

.TS
tab(@);
c c c
A A A .
Autor@Titlu@Tara
Gauss Carl@Aritmetica 1@Germania
Gauss Carl@Aritmatica 2@Germania
Gauss Carl@Aritmetica 3@Germania
.TE

出力例(以降nroff -t -Tascii):

  Autor         Titlu         Tara
Gauss Carl   Aritmetica 1   Germania
Gauss Carl   Aritmatica 2   Germania
Gauss Carl   Aritmetica 3   Germania

https://raku.org

答え4

$ cat tst.awk
BEGIN { FS=OFS="\t" }
NR==FNR {
    if ( NR > 1 ) {
        for ( i=1; i<=NF; i++ ) {
            if ( $i != ($i+0) ) {
                isGood[i]
            }
        }
    }
    next
}
{
    out = sep = ""
    for ( i=1; i<=NF; i++ ) {
        if ( i in isGood ) {
            out = out sep $i
            sep = OFS
        }
    }
    print out
}

$ awk -f tst.awk file file
Autor   Titlu   Tara
Gauss Carl      Aritmetica 1    Germania
Gauss Carl      Aritmatica 2    Germania
Gauss Carl      Aritmetica 3    Germania

関連情報