스크립트에서 두 개의 변수 스트림을 awk에 입력으로 전달합니다.

스크립트에서 두 개의 변수 스트림을 awk에 입력으로 전달합니다.

이것은 내 원래 명령줄입니다.

awk 'FNR==NR{a[$2]=$1;next}($2 in a){if(a[$2]!=$1)print $2}' file1 file2

처음에는 각 섹션을 파일로 출력한 후 다음 줄에서 해당 파일을 입력으로 사용하는 bash 스크립트에 있습니다. 그러나 이제 변수 사용으로 전환 중이며 이 줄에 이르렀고 이중 입력으로 인해 중단되었습니다.

그래서 더 이상 awk에 파일을 공급하려고 하지 않고 변수를 공급하고 싶습니다.

변수를 다루고 있다면 다음과 같이 할 것입니다.

echo "$var1" | awk '{$1=$2=""; print $0}'

하지만 bash 스크립트에서 awk에 두 번째 변수/스트림을 전달하는 방법에 대한 예를 찾을 수 없습니다.

내가 시도한 것의 예:

awk 'FNR==NR{a[$2]=$1;next}($2 in a){if(a[$2]!=$1)print $2}' "$var1" "$var2"

echo "${var1}" | awk 'FNR==NR{a[$2]=$1;next}($2 in a){if(a[$2]!=$1)print $2}' "${var2}"

awk -v s1="$var1" -v s2="$var2" 'FNR==NR{a[$2]=$1;next}($2 in a){if(a[$2]!=$1)print $2}' "$s1" "$s2"

편집하다:

일부 배경에서는 매우 단순화된 버전이지만 다음과 같은 파일 세트가 있습니다.

:~/test$ ls -lR ?/file*
-rw-rw-r-- 1 madivad madivad 11 Apr 19 23:17 1/file.0
-rw-rw-r-- 1 madivad madivad  6 Apr 19 23:04 1/file.1
-rw-rw-r-- 1 madivad madivad  8 Apr 19 23:04 1/file.2
-rw-rw-r-- 1 madivad madivad  8 Apr 19 23:04 1/file.3
-rw-rw-r-- 1 madivad madivad  6 Apr 19 23:05 2/file.1
-rw-rw-r-- 1 madivad madivad 10 Apr 19 23:06 2/file.3
-rw-rw-r-- 1 madivad madivad  6 Apr 19 23:05 2/file.4
-rw-rw-r-- 1 madivad madivad 11 Apr 19 23:17 2/file.5

또한 각 디렉터리 구조에 대한 해시 결과를 포함하는 두 개의 감사 파일이 있습니다. 이 파일은 상당히 깊이 있고 각각 500MB가 넘는 데이터를 포함할 수 있습니다.

명령줄에서 중복 항목, 기간, 크기, 누락된 파일 등을 찾는 여러 도구를 작성했습니다. 프로세스를 더욱 자동화하고 배치 파일에 포함시키려고 합니다. 실제로 모든 것을 배치 파일에 넣고 하드 드라이브를 준비 위치로 사용했습니다. 즉, 각 출력을 파일로 하드 드라이브에 저장하고 다음 배치 라인에서 해당 파일을 로드하고 계속합니다. 내 목표는 모든 중복 파일을 제거하는 것입니다.

파일 구조는 표준 hashdeep출력에 있지만 고정된 해시 문자열, 몇 개의 공백, 파일의 전체 경로 및 파일 이름만 포함하도록 조작했습니다. 다음과 같이 시작됩니다.

~/test$ head 2/audit?
==> 2/audit1 <==
%%%% HASHDEEP-1.0
%%%% size,md5,sha256,filename
## Invoked from: /home/madivad/test/1
## $ hashdeep -l file.0 file.1 file.2 file.3
##
11,3213c6d334141924ab1454f0349a0ccb,6f92601344e16851316e7cda90d053c0ad234e047ccf81ce6fe89e78bbdb111e,file.0
8,736e5da8b598eec84d4ec0e1be63b6d1,eeda2f21a9320e751d98a92ceb903bdf5e9e5b6f6ca3690fdc0fb67b70a5efb2,file.2
8,e487aeec573e0936c1ac9f091130c20b,1bbb337a707d059be503510600b59292bbc9b1a171fe2b0b07ec122bc2bbff4f,file.3
6,fa8f294721ab3fbb37793c68ff2cf09b,32c66107f0f4f2053128e519681fc8e88806d0d2b17607ce9f2362aff66ad6c7,file.1

==> 2/audit2 <==
%%%% HASHDEEP-1.0
%%%% size,md5,sha256,filename
## Invoked from: /home/madivad/test/2
## $ hashdeep -l file.1 file.3 file.4 file.5
##
11,3213c6d334141924ab1454f0349a0ccb,6f92601344e16851316e7cda90d053c0ad234e047ccf81ce6fe89e78bbdb111e,file.5
6,9e87b0fde0cf6b641bd4a27aee5f5536,247ed9d62df1b8b2da7dedf48b0795ef302d21811885180384c3f560c819d361,file.4
6,fa8f294721ab3fbb37793c68ff2cf09b,32c66107f0f4f2053128e519681fc8e88806d0d2b17607ce9f2362aff66ad6c7,file.1
10,b7b9e4419c0708f401d45f061ac9a231,fcfecc7079ad08912d7a0ebcb24816442067b101a0da0c252533b78e00c19c52,file.3

처리를 시작하면 awk이미 다음과 같은 결과가 나타납니다.

~/test$ head 2/so*
==> 2/sort1 <==
3213c6d334141924ab1454f0349a0ccb6f92601344e16851316e7cda90d053c0ad234e047ccf81ce6fe89e78bbdb111e    file.0
736e5da8b598eec84d4ec0e1be63b6d1eeda2f21a9320e751d98a92ceb903bdf5e9e5b6f6ca3690fdc0fb67b70a5efb2    file.2
e487aeec573e0936c1ac9f091130c20b1bbb337a707d059be503510600b59292bbc9b1a171fe2b0b07ec122bc2bbff4f    file.3
fa8f294721ab3fbb37793c68ff2cf09b32c66107f0f4f2053128e519681fc8e88806d0d2b17607ce9f2362aff66ad6c7    file.1

==> 2/sort2 <==
3213c6d334141924ab1454f0349a0ccb6f92601344e16851316e7cda90d053c0ad234e047ccf81ce6fe89e78bbdb111e    file.5
b7b9e4419c0708f401d45f061ac9a231fcfecc7079ad08912d7a0ebcb24816442067b101a0da0c252533b78e00c19c52    file.3
9e87b0fde0cf6b641bd4a27aee5f5536247ed9d62df1b8b2da7dedf48b0795ef302d21811885180384c3f560c819d361    file.4
fa8f294721ab3fbb37793c68ff2cf09b32c66107f0f4f2053128e519681fc8e88806d0d2b17607ce9f2362aff66ad6c7    file.1

이 질문에 따라 실행하려고 하는 특정 줄의 경우 $2파일 이름이 두 파일 모두에 나타나지만 해시 $1`이 일치하지 않는 경우에만 a[$2] and위 입력이 파일 이름을 출력하도록 하고 싶습니다.

따라서 위의 입력에 대해서는 다음만 볼 것으로 예상됩니다.

file.3

답변1

다음 변수를 고려하십시오.

$ a=$'one\ntwo';echo "$a"
one
two
$ b=$'three\nfour';echo "$b"
three
four

가능한 옵션은 다음과 같습니다.

$ printf '%s\n%s\n' "$a" "$b" |awk '{print NR,$0}'
$ awk '{print NR,$0}' <(echo "$a") <(echo "$b")   #process substitution as per Kusalananda's comment
$ echo "$a" |awk '{print NR,$0}' - <(echo "$b")
$ { echo "$a" && echo "$b";} |awk '{print NR,$0}'  #or even { echo "$a";echo "$b";}
$ awk '{print NR,$0}' <(echo "$a";echo "$b")
$ awk '{print NR,$0}' <<<$(echo "$a";echo "$b")

위의 모든 예의 결과는 다음과 같습니다.

1 one
2 two
3 three
4 four

변수가 새 줄로 끝나는 경우(즉, 변수에 파일의 내용이 포함되어 있는 경우) 다음과 같습니다.

$ a=$'one\ntwo\n'
$ b=$'three\nfour\n'

그러면 이것도 작동합니다:

$ awk '{print NR,$0}' <<<"$a$b"
1 one
2 two
3 three
4 four
5 

관련 정보