파이프로 연결된 명령에 대한 별칭 세트를 바인딩하고 여기에서 일부 스레드를 찾아본 결과 cmd 행을 다르게 사용해야 한다는 사실을 발견했습니다. $1 대신 !:1을 사용하지만 다음 상황에서는 작동하지 않는 것 같습니다.
이것은 별칭을 지정하려는 명령 세트입니다(중앙값을 계산함).
shell> cat file_with_numbers| awk '{print $1}' | sort -n | awk ' { a[i++]=$1; } END { x=int((i+1)/2); if (x < (i+1)/2) print (a[x-1]+a[x])/2; else print a[x-1]; }'
shell> 1.15
아래 섹션의 별칭을 "중앙값"으로 지정하고 싶습니다.
sort -n | awk ' { a[i++]=$1; } END { x=int((i+1)/2); if (x < (i+1)/2) print (a[x-1]+a[x])/2; else print a[x-1]; }'
그래서 나는 사용할 수 있습니다
shell> cat file_with_numbers| awk '{print $1}' | median
alias median 'sort -n | awk ' { a[i++]=$1; } END { x=int((i+1)/2); if (x < (i+1)/2) print (a[x-1]+a[x])/2; else print a[x-1]; }''
() 위치가 좋지 않습니다. //작은따옴표 오류
alias median "sort -n | awk ' { a[i++]=$1; } END { x=int((i+1)/2); if (x < (i+1)/2) print (a[x-1]+a[x])/2; else print a[x-1]; }'"
cat file| awk '{print $5}'| median
awk: { a[i++]=; } END { x=int((i+1)/2); if (x < (i+1)/2) print (a[x-1]+a[x])/2; else print a[x-1]; }
awk: ^ syntax error
\!:1
그래서 다음 으로 전환하여 시도했지만 여전히 작동하지 않습니다. 이 별칭을 올바르게 사용하려면 어떻게 해야 합니까?
1>테스트 1
alias median "sort -n | awk ' { a[i++]=\!:1; } END { x=int ( ( i+1 ) /2 ) ; if ( x < ( i+1 ) /2 ) print ( a[x-1]+a[x] ) /2 ; else print a[x-1] ; }' "
cat file| awk '{print $5}' | median
Bad ! arg selector.
2> 시험 2
alias median "sort -n | awk ' { a[i++]=\\!:1; } END { x=int ( ( i+1 ) /2 ) ; if ( x < ( i+1 ) /2 ) print ( a[x-1]+a[x] ) /2 ; else print a[x-1] ; }' "
cat file| awk '{print $5}' | median
awk: { a[i++]=!:1; } END { x=int ( ( i+1 ) /2 ) ; if ( x < ( i+1 ) /2 ) print ( a[x-1]+a[x] ) /2 ; else print a[x-1] ; }
awk: ^ syntax error
시험 3>
답변1
일련의 한 줄 명령을 별칭에 넣을 수 있지만 여기저기에 백슬래시와 작은따옴표 또는 큰따옴표를 추가해야 할 수도 있습니다. 그러나 셸 기록의 인수나 요소를 사용하여 별칭을 호출해야 하거나 속도를 최대화해야 하는 경우가 아니면 명령 시퀀스를 있는 그대로 파일에 넣고 실행 가능한 것으로 표시된 다음 파일에 배치하는 것이 더 쉬울 것입니다. 파일 어딘가에 있습니다. 검색 경로( $PATH
또는 $path
).
그러나 다음을 별칭으로 만드십시오.
sort -n | awk '{ a[i++]=$1; } END { x=int((i+1)/2); if (x < (i+1)/2) print (a[x-1]+a[x])/2; else print a[x-1]; }'
당신은 확실히해야합니다
- 파이프 연산자는 인용된 문자열 안에 있습니다. 그렇지 않으면 별칭 명령이 종료됩니다.
- the는
$
작은 따옴표로 묶인 문자열 내부이거나 a가 앞에 있는 따옴표로 묶인 문자열 외부에 있습니다\
(대안을 제공한 Stéphane에게 감사드립니다). - 중첩된 작은따옴표 없음
\!:1
프로덕션을 시도하는 데 사용하지 마십시오 $1
. \!:1
매개변수를 별칭에 전달하면 해당 매개변수가 사용됩니다. 당신은 $1
awk가 텍스트를 보기를 원합니다.
이 경우 가장 안전한 방법은 가능한 많은 별칭을 작은따옴표로 묶고 "
리터럴을 묶는 데 작은따옴표만 사용하는 것입니다. 다음 내용이 두 번 나타나는 것을 볼 수 있습니다 "'"
.
ubuntu% alias median 'sort -n | awk '"'"'{ a[i++]=$1 ; } END { x=int ( ( i+1 ) /2 ) ; if ( x < ( i+1 ) /2 ) print ( a[x-1]+a[x] ) /2 ; else print a[x-1] ; }'"'"
ubuntu% seq 1 9 | median
5
답변2
바퀴를 재발명하는 데 관심이 없다면 GNU를 사용할 수도 있습니다 datamash
.
alias median 'datamash median 1'
datamash
탭으로 구분된 열은 필수입니다. 단, 를 사용하여 구분 기호를 변경할 수 있습니다 -t
.
특정 문제의 경우 $parameter
(t)csh의 확장은 큰따옴표 내에서 수행되지만 Bourne과 같은 쉘과 달리 백슬래시로 비활성화할 수 없으므로 다음과 같은 것이 필요합니다.
alias median "sort -n | awk '{a[NR]="\$"1}; END {x = int(NR/2); print NR % 2 ? a[x+1] : (a[x]+a[x+1])/2}'"
$
즉, as를 입력하려면 큰따옴표를 제거 \$
하거나 Mark의 접근 방식을 사용하여 작은따옴표를 사용하되 문자 그대로의 작은따옴표를 입력하려면 큰따옴표를 제거하십시오.
답변3
이 시도:
$ alias median="sort -n|awk ' { a[i++]="\$1"; } END { x=int((i+1)/2); if (x < (i+1)/2) print (a[x-1]+a[x])/2; else print a[x-1]; }'"
$ cat file_with_numbers| awk '{print $1}'|median