最初の列の内容に基づいてファイルを区切る

最初の列の内容に基づいてファイルを区切る

拡張子がタブで区切られた複数のファイルがあります.cluster。次の基準を使用して、最初の列の内容に基づいてこれらのファイルを分類したいと思います。 (2および3はファイル内の実際の番号/内容です。)

  • class_1:連続した行に2ANDのみが表示されます。3
  • class_2:2存在のみ
  • class_3:のみ3存在する

.txtファイル名をそのクラス名でファイルに書きたいです。シェルスクリプトを使用してこれをどのように実行できますか?

答え1

for filename in *.cluster
do
    class=$(cut -d$'\t' -f1)                      # Part 1
    if [ $(wc -l "$filename") -eq 2 ]             # Part 2, start
    then
        class=1
    fi                                            # Part 2, end
    printf '%s\n' "$filename" >> class_"$class".txt # Part 3
done

これは3つの部分に分けられます。

  1. デフォルトでは、一意の行の最初のフィールドに基づいてファイルを並べ替えます。変数は、class各行の最初のタブ文字までファイル内のすべての項目に設定されます。カテゴリ2とカテゴリ3の場合、これはこのファイルに1行しかない2からです。3

    cut区切り文字でファイルを分割する$'\t'Bashでタブを作成する方法です。、最初の区切りフィールドのみを出力する必要があり-f1ます。cut

  2. ファイルが2つの場合ワイヤー$(wc -l "$filename") -eq 2)、それ〜しなければならないクラス1なので、class変数が強制的に1になり、ステップ1の値が置き換えられます。if...fiこの問題を解決するために。
  3. 最後に、ファイル名が適切なクラスファイルに追加されます。printf '%s\n' "$filename" >> class_"$class".txt

最後に、class_N.txt1、2、3の各Nに対して3つのファイルがあり、1行に1つのファイル名があります。どのファイルにどのファイルがある場合その他最初のフィールドや長さが異なる場合など、質問に記載されているものと異なるものがある場合は、追加のクラスファイルが生成されます。

ファイル名自体に改行文字が含まれている珍しい場合は、競合が発生します(ファイル名の選択を再検討する機会を提供しますが)、そうでなければ問題はありません。

関連情報