쉼표 구분 기호가 있는 테이블 형식 파일을 빠르게 보기 위해 별칭을 만들고 싶습니다.
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
이것을 할 수 있습니다.