여러 파일의 열 이름을 변경하는 방법은 무엇입니까?

여러 파일의 열 이름을 변경하는 방법은 무엇입니까?

각 파일의 열 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의 도움으로 두 개의 별도 명령을 사용하여 이 작업을 더 쉽게 수행할 수 있습니다.
첫 번째는 두 번째 줄에 각 파일의 이름을 쓰는 것입니다.

sed -i 2F *

두 번째 - 편집:

sed -i '1!b;N;s/\S*\n//' *

실제로 -i플래그는 파일의 라인 주소 지정을 구분합니다(AWK의 FNR 변수와 유사).

관련 정보