"paste" 명령의 출력에서 ​​헤더 생성

"paste" 명령의 출력에서 ​​헤더 생성

내 폴더(데이터)에는 텍스트 파일이 많이 포함되어 있습니다. 각 텍스트 파일에는 30개의 숫자 열이 포함되어 있습니다. 이 텍스트 파일의 열을 결합하는 테이블을 만들고 싶습니다. 다음 명령을 사용했습니다.

  cd data
  paste *.txt > all_data.txt

출력은 다음과 같습니다.

0.834679    0.612341    0.510057    0.580128  .....
1.837894    1.061547    0.961449    1.343096  .....
1.638215    1.024628    1.113596    1.80506  .....
1.596119    0.971842    1.14204     1.73881  .....
1.568142    1.025716    1.217219    1.769668  .....
1.554016    0.977165    1.226769    1.786335  .....
1.543137    1.001812    1.247598    1.840443  .....
1.491823    0.99437     1.28337     1.784271  .....
1.371208    0.931998    1.259749    1.717408  .....
1.390867    0.905996    1.300722    1.739213  .....
1.35813     0.283377    1.307122    1.733058  .....
......

이 명령은 모든 열을 하나의 큰 스프레드시트로 병합합니다. 내 질문: 각 열을 텍스트 파일에 붙여넣고 해당 열에 텍스트 파일 이름 헤더를 추가하는 방법이 있습니까? 다음과 같이:

text_file1  text_file2  text_file3  text_file4 ....  
0.834679    0.612341    0.510057    0.580128  .....
1.837894    1.061547    0.961449    1.343096  .....
1.638215    1.024628    1.113596    1.80506  .....
1.596119    0.971842    1.14204     1.73881  .....
1.568142    1.025716    1.217219    1.769668  .....
1.554016    0.977165    1.226769    1.786335  .....
1.543137    1.001812    1.247598    1.840443  .....
1.491823    0.99437     1.28337     1.784271  .....
1.371208    0.931998    1.259749    1.717408  .....
1.390867    0.905996    1.300722    1.739213  .....
1.35813     0.283377    1.307122    1.733058  .....
......

답변1

넌 할 수있어:

paste_with_header() (
  IFS=$(printf '\t') # or IFS=$'\t' with some shells
  printf '%s\n' "$*"
  paste -- "$@"
)

paste_with_header text_file* > all_data.txt

"$*"$IFS로 설정한 의 첫 번째 문자와 연결된 위치 인수(함수에 대한 인수) 목록을 확장합니다 . TAB이는 paste파일의 행을 연결하는 데에도 사용됩니다.

헤더에서 파일 확장자를 제거하려면 다음을 사용하십시오 zsh.

paste_with_header() (
  printf '%s\n' ${(pj:\t:)@:r}
  paste -- "$@"
)
  • ${@:r}각 위치 인수의 루트 이름으로 확장됩니다(확장자 제거).
  • j:\t:추가할 매개변수 확장 플래그입니다 \t. 이는 다음과 같이 해석 p됩니다 .\tTAB

를 사용하거나 ksh93파일 에 확장자가 있거나 경로 구성 요소에 디렉터리 포함 점이 없다고 가정합니다.zshbash

paste_with_header() (
  IFS=$'\t'
  printf '%s\n' "${@%.*}"
  paste -- "$@"
)

${@%.*}.*각 위치 인수의 끝과 일치하는 가장 짧은 후행 부분을 제거합니다( foo.txt가 되지만 빈 문자열이 된다는 foo점에 유의하세요 )../foo

(이는 분명히 파일 이름에 테이블이나 개행 문자가 포함되어 있지 않다고 가정합니다).

관련 정보