一部のデータを含むテーブルがあり、数字(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
)を除いて、数字で終わるすべての列を削除します。
しかし、実際には仕事が多すぎます。より簡単です:
.
3行末のピリオドを削除し、N
数値列とA
文字列(タイトルなし、データ)を指定するnroff / groff列形式セクションに新しい4行を挿入し、- Rakuを使用してヘッダーを解析し(以下の例では
N A A N N A .
新しい行_#4として使用) - 指定された列を削除します
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
答え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