![bash: 두 번째 파일에 포함된 사용자 이름으로 일치하는 숫자 교체](https://rvso.com/image/1539555/bash%3A%20%EB%91%90%20%EB%B2%88%EC%A7%B8%20%ED%8C%8C%EC%9D%BC%EC%97%90%20%ED%8F%AC%ED%95%A8%EB%90%9C%20%EC%82%AC%EC%9A%A9%EC%9E%90%20%EC%9D%B4%EB%A6%84%EC%9C%BC%EB%A1%9C%20%EC%9D%BC%EC%B9%98%ED%95%98%EB%8A%94%20%EC%88%AB%EC%9E%90%20%EA%B5%90%EC%B2%B4%20.png)
게시된 결과를 얻기 위해 "파일 1"의 각 줄의 마지막 번호를 "파일 2"의 일치하는 사용자 이름으로 바꾸고 싶습니다.
파일 1:
13/02/28 46.149002259
13/03/22 68.234001404
16/14/03 69.83500766
14/01/29 87.083008540
16/14/03 106.516006874
14/03/16 201.552002260
12/03/12 207.521011278
16/08/18 234.7780151002
파일 2:
사용자 5874
사용자 2404
사용자 81002
사용자 4540
사용자1259
사용자 6260
사용자7278
사용자366
이것은 "파일 2"의 일부일 뿐입니다. 파일에는 실제로 훨씬 더 많은 사용자가 포함되어 있습니다.
결과:
28/02/13 46.149002 사용자1
22/03/13 68.234001 사용자2
14/03/16 69.835007 사용자3
29/01/14 87.083008 사용자4
14/03/16 106.516006 사용자5
14/03/16 201.552 002 사용자6
03/12/12 207.521011 사용자
7 18 /08/16 234.778015 사용자8
답변1
나는 귀하의 파일이 공백으로만 열을 분리하는 엄격한 형식을 가지고 있다고 가정합니다(사용자 이름 안에는 공백이 없습니다). 그러면 이것이 작동할 것입니다(적어도 Linux에서는 내 테스트베드가 Kubuntu입니다).
while read date value number ; do printf "%s %s %s\n" "$date" "$value" "$(grep " $number" file2 | head -n 1 | cut -f 1 -d " ")" ; done <file1
몇 가지 설명:
- 명령은
file1
(… <file1
)에서 읽습니다. - 한 줄( )을 읽을 수 있는 한
while read …
… printf …
... 세 번째 필드를 ...로 대체하여 인쇄합니다( ).- …효과(
$( … )
) …file2
... (grep …
, 선행 공백에 주의하세요:" $number"
) 안에 주어진 숫자가 포함된 줄을 검색합니다 ...- ... 첫 번째 일치 항목만 선택되는 경우(
head …
만일의 경우에 대비해), ... - … 그러면 첫 번째 열만 남습니다(
cut …
).