特定のファイルの列の一部を選択することにより、複数のファイルからファイル内のデータを作成および整理したい。各ファイルの2列目、3列目、4列目をコピーして、それらを1つのファイルに貼り付けるファイルが10個以上あります。
これは、awk
を使用して非常に簡単に行うこともできます。
$ awk '{print $2,$3,$4}' *.txt > collapsed_output.txt
ここにいくつかのサンプルデータがあります。
$ seq 20 | paste - - - - - > sample.txt
行は次のようになります。
$ head sample.txt
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
それでは、10個のコピーを作成しましょう。
$ seq 10 | xargs -I{} cp sample.txt sample{}.txt
次のファイルがあります。
$ tree
.
|-- sample10.txt
|-- sample1.txt
|-- sample2.txt
|-- sample3.txt
|-- sample4.txt
|-- sample5.txt
|-- sample6.txt
|-- sample7.txt
|-- sample8.txt
|-- sample9.txt
`-- sample.txt
awk
コマンドを実行すると、次のようになります。
$ awk '{print $2, $3, $4}' sample{1..10}.txt | column -t
2 3 4
7 8 9
12 13 14
17 18 19
2 3 4
7 8 9
12 13 14
17 18 19
2 3 4
7 8 9
12 13 14
17 18 19
...
ここでは、最初の3つのファイル(sample01.txt
... sample03.txt
)の出力を示します。また、column -t
コマンドを使用して出力をフォーマットしていますが、これは表示を目的としたものであり、U&Lで出力が見やすくなっています。
awk
コマンド内で追加のフォーマットを簡単に行うことができますが、それは問題の範囲を超えているようです。
cut
という名前のコマンドラインユーティリティ をご覧ください。列が一意の区切り文字で区切られている場合、列を抽出できます。パーツを再結合するには、 paste
を使用できます。
たとえば、一般的なコンマ区切り形式がある場合
$ cat debts.csv
Name,Age,Debt
Alice,20,1337
Bob,30,42
$ cat pets.csv
Name,Pet
Alice,Dog
Bob,Cat
あなたは名前と借金を抽出することができます
$ cut -d, -f1,3 debts.csv
Name,Debt
Alice,1337
Bob,42
と借金をペットと組み合わせる
$ cut -d, -f2 pets.csv | paste -d, debts.csv -
Name,Age,Debt,Pet
Alice,20,1337,Dog
Bob,30,42,Cat
cut
およびpaste
、-d
はフィールドの区切り文字を決定し、-f
は、cut
に対して抽出する列を選択し、-
は、ファイルの代わりに標準入力(つまり、後者のpaste
の場合、パイプから)を使用するように指示します。