web-dev-qa-db-ja.com

異なるファイルからいくつかの列を選択、コピー、貼り付け、それらから1つのファイルを作成する方法は?

特定のファイルの列の一部を選択することにより、複数のファイルからファイル内のデータを作成および整理したい。各ファイルの2列目、3列目、4列目をコピーして、それらを1つのファイルに貼り付けるファイルが10個以上あります。

6
AiB

これは、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コマンド内で追加のフォーマットを簡単に行うことができますが、それは問題の範囲を超えているようです。

12
slm

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の場合、パイプから)を使用するように指示します。
6
XZS