複数のファイルの列名を変更するには?

複数のファイルの列名を変更するには?

各ファイルの列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オプションを使用してファイルを所定の位置に編集します。実装でこのオプションが利用できない場合は、一時ファイルを使用する必要があります。sSCORESUM"$f"1-isedsed

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変数に似ています)。

関連情報