기본 사항부터 시작하여 숫자, 하나 이상의 공백, 파일 이름(경로 포함)이 포함된 파일이 있습니다. 파일 이름과 경로에는 공백이 포함될 수도 있습니다.
awk
별도의 파일에서 이러한 필드 간의 동일성을 추가로 테스트할 때 별도의 구성 요소를 사용하고 싶습니다 .
첫 번째 문제를 다루는 파일은 다음과 같습니다.
111 aaa/aaa
222 b b/bbb
333 ccc/c c
444 d d/d d
출력을 보고 싶습니다.
aaa/aaa 111
b b/bbb 222
ccc/c c 222
d d/d d 222
여기서 핵심은 위 출력 형식이 아니라 이러한 변수를 설정한 후 표현식에 사용할 수 있는 기능 등 입니다 $1
. 여기에는 파일이 하나뿐이지만 실제로는 두 세트의 파일을 비교하고 있지만 먼저 이 구성 요소를 이해해야 합니다.$2
$3
awk
$1
줄 시작 부분에 영숫자 시퀀스를 포함해야 하며,
$2
파일 이름 없이 전체 경로를 포함해야 하며,
$3
파일 이름만 포함해야 합니다.
프로그램 중에 변경을 시도했지만 FS
이런 일이 발생하지 않았습니다.
$ awk 'BEGIN{OFS=" || "}{FS=" ";a[$1]=1;FS="/";b[$NF]=1;print $1, $2, $NF}' file1
111 || dir1/a || aa
222 dir1 || bbb || bbb
333 dir1 || c cc || c cc
444 dir1 || ddd || ddd
555 dir2 || e ee || e ee
666 dir2 || fff || fff
999 dir2 || zzz || zzz
FS
슬래시가 제거되었을 뿐만 아니라 첫 번째 변수도 두 번째 변수만 사용하기 때문에 잘못된 것입니다.FS
답변1
왜 이렇게 해야 하는지는 잘 모르겠지만 (예를 들어) 명시적인 공백 구분 기호를 저장하고 제거한 $1
다음 대체 구분 기호를 사용하여 나머지를 분할할 수 있습니다. 예를 들어:
$ awk '
{
a=$1; $1=""; sub(/^ */,"");
n=split($0,p,"/");
$1=a; for(i=1;i<=n;i++) $(i+1) = p[i]
} {
print $2"/"$3, $1
}' file
aaa/aaa 111
b b/bbb 222
ccc/c c 333
d d/d d 444
답변2
while read -r f1 fpath; do
printf '%s\t%s\n' "$fpath" "$f1"
done < file1
당신이 무엇을 추구하는지 잘 모르겠지만 필요한 것보다 더 복잡하게 만들고 있습니다.
결과:
aaa/aaa 111
b b/bbb 222
ccc/c c 333
d d/d d 444