특정 개수의 행이있는 파일에 값 열을 추가하는 방법 다음과 같은 입력 파일이 있습니다.
입력 파일:
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
약간의 속임수로 paste
OP의 목적으로 사용할 수 있습니다 . 그러나 파일을 대체하지 않습니다.
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 ...