ファイル名の一意の文字に一致するファイルの列を生成するにはどうすればよいですか?

ファイル名の一意の文字に一致するファイルの列を生成するにはどうすればよいですか?

ファイルがたくさんあります。

an_ar_chrom10_pos1_sun_td.txt
an_ar_chrom11_pos1_sun_td.txt
an_ar_chrom13_pos1_sun_td.txt
an_ar_chrom17_pos1_sun_td.txt
an_ar_chrom17_pos2_sun_td.txt
...

各ファイルには以下の形式があります。

head an_ar_chrom10_pos1_sun_td.txt
    "region" "start" "stop" "mid" "G1_TD" "G2_TD" "G3_TD" "G4_TD"
    "45000002 - 45010001 " 45000002 45010001 90.010003 NA NA NA NA
    "45010002 - 45020001 " 45010002 45020001 90.030003 -1.19087678772119 -0.947895467698369 -0.724767209958411 -0.957244005901499
    "45020002 - 45030001 " 45020002 45030001 90.050003 NA NA NA NA
    "45030002 - 45040001 " 45030002 45040001 90.070003 NA NA NA NA

各ファイル名の一部の一意の文字(たとえば、最初のファイルの場合はchrom10_pos1、2番目のファイルの場合はchrom11_pos1など)に基づいて、各ファイルに追加の列を追加したいと思います。

これが私が望む出力です

head an_ar_chrom10_pos1_sun_td_with_id.txt
"region" "start" "stop" "mid" "G1_TD" "G2_TD" "G3_TD" "G4_TD" "ID_
"45000002 - 45010001 " 45000002 45010001 90.010003 NA NA NA NA chrom10_pos1
"45010002 - 45020001 " 45010002 45020001 90.030003 -1.19087678772119 chrom10_pos1-0.947895467698369 -0.724767209958411 -0.957244005901499 chrom10_pos1
"45020002 - 45030001 " 45020002 45030001 90.050003 NA NA NA NA chrom10_pos1
"45030002 - 45040001 " 45030002 45040001 90.070003 NA NA NA NA chrom10_pos1

答え1

スクリプト可能なエディタとファイル名のシェルループを使用してこれを処理します。

for f in *.txt
do
  value=$(printf '%s' "$f" | cut -d_ -f 3-4)
  printf '%s\n' '1s/$/ "ID"/' '2,$s/$/ '"$value"'/' 'wq' | ed -s "$f"
done

その後、現在のディレクトリのすべての「* .txt」ファイルを繰り返し編集します。ループの最初の行は、ファイル名から必要なデータを変数として抽出します。 2行目は3つのコマンドを印刷しますed

  1. 1s/$/ "ID"/- 新しい列ヘッダーを追加するには、行1を変更してください。
  2. 2,$s/$/ $value/(引用符付きの値で単純化) - 2行目からファイルの終わりまでの行の終わりをスペースと必要なデータで置き換えます。
  3. wq--ディスクにファイルを書き込んで終了します。

関連情報