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