各ファイルの列5の名前を特定のディレクトリにあるすべてのファイルのファイル名自体に変更したいと思います。私のディレクトリには、タブで区切られた列名を持つ250個のファイルがあります。
現在、すべてのファイルの列名は同じです。ファイルの例met-d-Glucose.txt
:
FID IID PHENO CNT 分数合計 3999347013_R01C01 1 -9 21 -0.217178 3999347013_R01C02 1 -9 21 -0.054835 3999347013_R02C01 1 -9 21 -0.130287 3999347013_R02C02 1 -9 21 0.0062288 3999347013_R03C01 1 -9 21 -0.0933029 3999347013_R03C02 1 -9 21 0.0434727
5番目の列の名前をファイル名に変更したいと思います。たとえば、上記のサンプルファイルの出力は次met-d-Glucose.txt
のようになります。
FID IID PHENO CNT met-d-Glucose.txt 3999347013_R01C01 1 -9 21 -0.217178 3999347013_R01C02 1 -9 21 -0.054835 3999347013_R02C01 1 -9 21 -0.130287 3999347013_R02C02 1 -9 21 0.0062288 3999347013_R03C01 1 -9 21 -0.0933029 3999347013_R03C02 1 -9 21 0.0434727
元の列名は常に SCORESUM です。タイトル行は常に最初の行です。列 5 以降は列がありません。 SCRESUMは他の場所には表示されません。
答え1
意図しない重複なしに単一の固定文字列を置き換えようとするため、次のGNU(シェルループ呼び出し)がsed
機能します。
for f in *.txt; do sed -i '1s/SCORESUM/'"$f"'/' "$f"; done
これは、ワイルドカードパターンに一致するすべてのファイルを繰り返し*.txt
(より具体的に必要な場合は調整)、使用を適用してsed
パターンをシェル変数に格納されているファイル名に置き換えますが、ファイルの最初の(先行)行にのみ適用されます。 GNUオプションを使用してファイルを所定の位置に編集します。実装でこのオプションが利用できない場合は、一時ファイルを使用する必要があります。s
SCORESUM
"$f"
1
-i
sed
sed
for f in *.txt; do sed '1s/SCORESUM/'"$f"'/' "$f" > tmp.txt; mv tmp.txt "$f"; done
シェル変数を使用するには、一重引用符sed
プログラムを'1s/.../.../'
中断し、二重引用符シェル変数参照を挿入します。
答え2
GNU Sedの助けを借りて、2つの別々のコマンドを使用してこれを簡単に実行できます。
1つ目は、2行目に各ファイルの名前を書き込むことです。
sed -i 2F *
2番目 - 編集:
sed -i '1!b;N;s/\S*\n//' *
実際、-i
フラグはファイルの行アドレス指定を区別します(AWKのFNR変数に似ています)。