복잡한 cmd, 따옴표 및 cmd 매개변수가 있는 tcsh 별칭

복잡한 cmd, 따옴표 및 cmd 매개변수가 있는 tcsh 별칭

파이프로 연결된 명령에 대한 별칭 세트를 바인딩하고 여기에서 일부 스레드를 찾아본 결과 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매개변수를 별칭에 전달하면 해당 매개변수가 사용됩니다. 당신은 $1awk가 텍스트를 보기를 원합니다.

이 경우 가장 안전한 방법은 가능한 많은 별칭을 작은따옴표로 묶고 "리터럴을 묶는 데 작은따옴표만 사용하는 것입니다. 다음 내용이 두 번 나타나는 것을 볼 수 있습니다 "'".

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

관련 정보