특정 개수의 행이있는 파일에 값 열을 추가하는 방법 다음과 같은 입력 파일이 있습니다.
입력 파일:
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 ...