텍스트 처리 문제입니다. 2개의 파일이 있습니다.
joeblogs
johnsmith
chriscomp
12:00:00 (AAA) OUT: "string" joeblogs@hostname
12:00:00 (AAA) OUT: "string" joeblogs@hostname
12:00:00 (AAA) OUT: "string" johnsmith@hostname
12:00:00 (AAA) OUT: "string" joeblogs@hostname
12:00:00 (AAA) OUT: "string" chriscomp@hostname
파일 1에는 로그(파일 2)에 나타나는 고유한 사용자 이름 목록이 포함되어 있습니다.
원하는 출력
12:00:00 (AAA) OUT: "string" USER1@hostname
12:00:00 (AAA) OUT: "string" USER1@hostname
12:00:00 (AAA) OUT: "string" USER2@hostname
12:00:00 (AAA) OUT: "string" USER1@hostname
12:00:00 (AAA) OUT: "string" USER3@hostname
이 두 파일은 필요 없을 것 같아요. 파일 1은 파일 2의 고유 사용자 이름을 구문 분석하여 생성됩니다. 내 논리는 내가 아는 사용자 이름 목록을 파일 2에 표시한 다음 이를 반복하여 sed
.
그것은 다음과 같습니다:
for i in $(cat file1);do sed -e 's/$i/USER[X]';done
USER[X]
각 고유 사용자 이름에 따라 증가합니다 .
그러나 나는 이것을 할 수 없습니다. 나는 그 논리가 건전하다고 생각하지도 않는다. 원하는 결과를 얻을 수 있도록 도와주실 수 있나요? awk
/// sed
모두 환영합니다.grep
bash
답변1
당신이 당신을 깨달았을 때"이 두 파일은 필요하지 않습니다.", 다음을 사용하십시오awk
초기 처리 솔루션통나무일회성 보관:
awk '{
u_name = substr($5, 1, index($5, "@"));
if (!(u_name in users)) users[u_name] = ++c;
sub(/^[^@]+/, "USER" users[u_name], $5)
}1' file.log
산출:
12:00:00 (AAA) OUT: "string" USER1@hostname
12:00:00 (AAA) OUT: "string" USER1@hostname
12:00:00 (AAA) OUT: "string" USER2@hostname
12:00:00 (AAA) OUT: "string" USER1@hostname
12:00:00 (AAA) OUT: "string" USER3@hostname
답변2
또 다른 이상한
awk '!($5 in a){a[$5]=++i}{sub("[^@]*","USER"a[$5],$5)}1' infile
답변3
Bash를 사용하면 다음과 같은 작업을 수행할 수 있습니다.
n=0
declare -A users=()
while IFS= read -r line; do
if [[ $line =~ ([^[:blank:]]+)@ ]]; then
user=${BASH_REMATCH[1]}
if [[ -z ${users[$user]} ]]; then
users[$user]=USER$((++n))
fi
line=${line/$user/${users[$user]}}
fi
echo "$line"
done < File2
또는 Perl 한 줄의 코드
perl -pe 's/(\S+)(?=@)/ $users{$1} ||= "USER".++$n /e' File2
답변4
를 사용하면 sed
다음을 수행할 수 있습니다.
$ sed "$(sed '=' File1 | sed -r 'N;s/(.*)\n(.*)/s%\2@hostname%USER\1@hostname%/')" File2
12:00:00 (AAA) OUT: "string" USER1@hostname
12:00:00 (AAA) OUT: "string" USER1@hostname
12:00:00 (AAA) OUT: "string" USER2@hostname
12:00:00 (AAA) OUT: "string" USER1@hostname
12:00:00 (AAA) OUT: "string" USER3@hostname
$
여기에는 3개의 명령이 있습니다 sed
. sed
명령 2와 3은 File1에서 sed 표현식을 생성하며, 이는 Command 1에서 File2를 처리하는 데 사용됩니다.
- 명령 2는 File1의 각 줄 뒤에 줄 번호를 추가합니다.
- 명령 3은 File1의 각 줄과 그 뒤에 오는 줄 번호를 식으로 다시 정렬하여 File1의 모든 사용자 등
sed
을 대체합니다joeblogs@hostname
.USER1@hostname
- 그런 다음 Command1은 생성된
sed
표현식을 사용하여 File2의 모든 대체 항목을 처리합니다.