파일 이름의 고유 문자와 일치하는 파일에 대한 열을 생성하려면 어떻게 해야 합니까?

파일 이름의 고유 문자와 일치하는 파일에 대한 열을 생성하려면 어떻게 해야 합니까?

파일이 잔뜩 있어요

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, 두 번째 파일의 경우 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" 파일을 반복하여 편집합니다. 루프의 첫 번째 줄은 파일 이름에서 필요한 데이터를 변수로 추출합니다. 두 번째 줄은 세 가지 명령을 인쇄합니다 ed.

  1. 1s/$/ "ID"/-- 새 열 헤더를 추가하려면 행 1을 변경하세요.
  2. 2,$s/$/ $value/(따옴표 있는 값으로 단순화) - 두 번째 줄부터 파일 끝까지 줄 끝 부분을 공백과 필수 데이터로 바꿉니다.
  3. wq--디스크에 파일을 쓰고 종료합니다.

관련 정보