파일 이름을 파일 헤더로 삽입하는 방법은 무엇입니까?

파일 이름을 파일 헤더로 삽입하는 방법은 무엇입니까?

예: 파일 이름: 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이를 사용합니다.printfed

답변2

또는 명령줄 제한(인수 길이 또는 개수) 없이 단일 호출 ed로 , with 를 계속 사용하는 경우:zsh

printf 'e %s\n1i\n\t%1$s\n.\nw\nq\n' * | ed

( zsh은 매개변수를 재사용할 수 있는 지정자를 printf지원합니다 %m$.)

관련 정보