기본부터 시작하여 숫자, 하나 이상의 공백, 파일 이름(경로 포함)이 있는 파일이 있습니다. 파일 이름과 경로에는 공백도 포함될 수 있습니다.
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