탭으로 구분 된 파일에 값 열 추가 개수의 행이있는 파일에

특정 개수의 행이있는 파일에 값 열을 추가하는 방법 다음과 같은 입력 파일이 있습니다.

입력 파일:

SPATA17 1   217947738
LYPLAL1 1   219383905
FAM47E  4   77192838
SHROOM3 4   77660162
SHROOM3 4   77660731
SHROOM3 4   77662248

결과물 파일:

SPATA17 1   217947738 file1
LYPLAL1 1   219383905 file1
FAM47E  4   77192838  file1
SHROOM3 4   77660162  file1
SHROOM3 4   77660731  file1
SHROOM3 4   77662248  file1

이 경우 파일의 행 수까지 값 열을 추가하고 싶습니다. 값은 “file1″과 같이 일관되게 유지됩니다.

그 이유는 100 개의 파일이 있기 때문에 각 파일을 열고 열을 붙여 넣기를 원하지 않습니다. 또한 디렉토리로 이동하여 값 열을 추가하여이를 자동화 할 수있는 방법이 있습니다. 값은 파일 이름에서 나옵니다. 파일 이름은 마지막 / 첫 번째 열에서 파일의 각 행에 추가해야합니다.



답변

다음과 같이 한 줄짜리 루프를 사용할 수 있습니다.

for f in file1 file2 file3; do sed -i "s/$/\t$f/" $f; done

목록의 각 파일에 sed대해 각 행의 끝에 탭과 파일 이름을 추가하는 데 사용 됩니다.

설명:

  • 은 Using -i와 플래그를 sed파일을 덮어 쓰기, 현재 위치에서 교체를 수행 할 수
  • 로 대체를 수행하십시오 s/PATTERN/REPLACEMENT/. 이 예제에서 PATTERN은 $행의 끝이며 REPLACEMENT는 \t(= TAB)이며 $f루프 변수의 파일 이름입니다. s///쉘 변수를 확장 할 수 있도록 명령은 큰 따옴표 내에 있습니다.

답변

paste명령 이있을 때 사람들이 그 강력한 도구를 추천하는 이유를 생각해보십시오 !

$ cat a
A
B
C
D
$ cat b
1
2
3
4
$ paste a b
A   1
B   2
C   3
D   4

약간의 속임수로 pasteOP의 목적으로 사용할 수 있습니다 . 그러나 파일을 대체하지 않습니다.

for f in file1 file2 file3; do
    paste $f <(yes $f | head -n $(cat $f | wc -l)) > $f.new
done

그러면 해당 파일 이름이 각 파일의 마지막 열로 새 파일에 붙여 넣어집니다 filename.new


답변

당신은 사용할 수 있습니다 awk:

awk '{print $0, FILENAME}' file1 file2 file3 ...