헤드와 컷을 이용한 앨리어스 파이프

헤드와 컷을 이용한 앨리어스 파이프

쉼표 구분 기호가 있는 테이블 형식 파일을 빠르게 보기 위해 별칭을 만들고 싶습니다.

alias thead='head | cut -d, -f1- | column -s, -t'

나중에 이렇게 사용됨

thead file.csv

그러나 이것은 작동하지 않습니다. 올바른 구문은 무엇입니까?

답변1

간단한 명령보다 더 고급 기능을 사용하려면 별칭 대신 셸 함수를 사용하세요.

thead () {
    head -- "$1" | cut -d, -f1- | column -s, -t
}

이 셸 함수는 head첫 번째 인수에서 실행된 다음 파이프를 통해 결과를 보냅니다 cut.모두이 부분은 열로 인해 제거될 수 있습니다 -f 1-. 원래 파이프라인에서 했던 것처럼 여기에 남겨두었습니다.

또는,

thead () {
    head -- "$2" | cut -d "$1" -f1- | column -s "$1" -t
}

...다음과 같이 사용할 수 있습니다.

thead ',' filename

아니면 심지어 허용임의로 선택할 수 있는구분 기호(제공되지 않은 경우 쉼표가 사용됨)

thead () {
    local delim=','

    if [ "$#" -gt 1 ]; then
        delim=$1
        shift
    fi
    
    head -- "$1" | cut -d "$delim" -f1- | column -s "$delim" -t
}

위의 함수 정의는 일반적으로 별칭을 정의하는 모든 위치에 배치할 수 있습니다.


별칭에 파이프를 사용할 때의 문제점은 매개변수와 함께 별칭을 사용할 때 매개변수가 파이프의 첫 번째 명령 뒤가 아니라 파이프 끝에 추가된다는 것입니다.


설명서 bash에는 이런 문장이 있습니다

거의 모든 목적에서 별칭은 쉘 함수로 대체됩니다.

답변2

alias확장은 단지 텍스트 교체이며 쉘에 의해 다시 구문 분석됩니다. 따라서 다음을 수행할 때:

thead file.csv

방금 다음으로 대체되었습니다.

head | cut -d, -f1- | column -s, -t file.csv

그리고 다시 설명했다.

당신이 쓰는 경우 :

<file.csv thead

또는

cat file.csv | thead

또는

{ thead; } < file.csv

다음으로 대체되므로 작동합니다.

<file.csv head | cut -d, -f1- | column -s, -t
cat file.csv | head | cut -d, -f1- | column -s, -t
{ head | cut -d, -f1- | column -s, -t; } < file.csv

각기. 어쨌든 @Kusalananda가 말했듯이 함수나 스크립트를 사용하는 것이 별칭을 사용하는 것보다 훨씬 낫습니다. 여기서는 다음을 수행하고 싶습니다.

thead() { head "$@" | cut -d, -f1- | column -s, -t; }

그래서 당신은 thead -n 12 file.csv file2.csv이것을 할 수 있습니다.

관련 정보