각 파일의 열 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 옵션을 사용하여 파일을 제자리에서 편집합니다. 구현에서 이 옵션을 사용할 수 없는 경우 임시 파일을 사용해야 합니다.s
SCORESUM
"$f"
1
-i
sed
sed
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 변수와 유사).