예: 파일 이름: ENSG00000000003
ENSG00000000003 43120.829491094
ENSG00000000005 39604.4956791524
ENSG00000000419 7645.05624570546
ENSG00000000457 2157.49855156382
ENSG00000000460 3317.98417717746
ENSG00000000938 6327.40515535397
예상되는 출력은 파일 이름 앞에 탭 문자가 있는 것이 가장 좋습니다.
ENSG00000000003
ENSG00000000003 43120.829491094
ENSG00000000005 39604.4956791524
ENSG00000000419 7645.05624570546
ENSG00000000457 2157.49855156382
ENSG00000000460 3317.98417717746
ENSG00000000938 6327.40515535397
45000개의 파일을 함께 루프에서 이 작업을 수행하고 싶습니다.
답변1
저는 표준 UNIX 편집기(틀림없이!):
for f in ENSG*
do
printf '1i\n\t%s\n.\nw\nq\n' "$f" | ed -s "$f"
done
그러면 다음과 같은 작은 명령 스크립트가 전송됩니다 ed
.
- 1행에
i
텍스트를 삽입합니다( ). 텍스트는printf
탭(\t
) 앞에 파일 이름으로 전달됩니다. - 텍스트 삽입(
.
) 후 파일을 디스크에 저장(w
)하고 종료(q
) 합니다.
파일 수가 명령줄 제한을 초과하는 것이 사실이라면 다음 명령을 사용하여 find
필요에 따라 매개변수(시작 디렉터리, 파일 이름 등)를 조정할 수 있습니다.
find . -name 'ENSG*' -exec sh -c 'printf "1i\n\t%s\\n.\nw\nq\n" "$1" | ed -s "$1" ' findsh {} \;
핵심 솔루션은 동일하지만 find
일치하는 각 (단일) 파일 이름에 대해 실행되는 "쉘 찾기"에 포함되어 있습니다. sh -c ...
문자열 findsh
은 스텁 이름 $0
이고 파일 이름은 중괄호 대신 쉘에 전달됩니다 {}
. 그런 다음 쉘 자체는 파일 이름을 인수로 사용하므로 및 명령이 $1
이를 사용합니다.printf
ed
답변2
또는 명령줄 제한(인수 길이 또는 개수) 없이 단일 호출 ed
로 , with 를 계속 사용하는 경우:zsh
printf 'e %s\n1i\n\t%1$s\n.\nw\nq\n' * | ed
( zsh
은 매개변수를 재사용할 수 있는 지정자를 printf
지원합니다 %m$
.)