拡張子がタブで区切られた複数のファイルがあります.cluster
。次の基準を使用して、最初の列の内容に基づいてこれらのファイルを分類したいと思います。 (2
および3
はファイル内の実際の番号/内容です。)
- class_1:連続した行に
2
ANDのみが表示されます。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つの部分に分けられます。
デフォルトでは、一意の行の最初のフィールドに基づいてファイルを並べ替えます。変数は、
class
各行の最初のタブ文字までファイル内のすべての項目に設定されます。カテゴリ2とカテゴリ3の場合、これはこのファイルに1行しかない2
からです。3
cut
区切り文字でファイルを分割する、$'\t'
Bashでタブを作成する方法です。、最初の区切りフィールドのみを出力する必要があり-f1
ます。cut
- ファイルが2つの場合ワイヤー(
$(wc -l "$filename") -eq 2
)、それ〜しなければならないクラス1なので、class
変数が強制的に1になり、ステップ1の値が置き換えられます。if
...fi
この問題を解決するために。 - 最後に、ファイル名が適切なクラスファイルに追加されます。
printf '%s\n' "$filename" >> class_"$class".txt
最後に、class_N.txt
1、2、3の各Nに対して3つのファイルがあり、1行に1つのファイル名があります。どのファイルにどのファイルがある場合その他最初のフィールドや長さが異なる場合など、質問に記載されているものと異なるものがある場合は、追加のクラスファイルが生成されます。
ファイル名自体に改行文字が含まれている珍しい場合は、競合が発生します(ファイル名の選択を再検討する機会を提供しますが)、そうでなければ問題はありません。