Unix 쉘 스크립트의 Cut에서 탭 구분 기호 사용

Unix 쉘 스크립트의 Cut에서 탭 구분 기호 사용

내 파일에는 input.txt다음과 같은 탭으로 구분된 형식의 데이터가 포함되어 있습니다.

23776112        Inactive        Active
23415312        Inactive        Active

요구 사항에 따라 while 루프 내에서 첫 번째 열의 데이터를 잘라내어 다음을 사용하여 인쇄하고 싶습니다.

아래는 코드의 일부입니다 -

......
......
    while read line
    do  
        SN=`echo ${line}|cut -d '       ' -f1`
        echo $SN
    done < input.txt
....
....

위의 탭 문자를 구분 기호로 사용하려면 다음을 사용합니다.Ctrl V Tab

그러나 출력은 예상과 다릅니다. 나는 O/P를 얻었다-

23776112 Inactive Active
23415312 Inactive Active

그리고 나는 O/P를 다음과 같이 원합니다 -

23776112 
23415312

답변1

cut -f 1 input.txt

그러면 탭으로 구분된 파일의 첫 번째 열이 제공됩니다 input.txt. 기본 필드 구분 기호 cut는 탭이므로 추가 지정이 필요하지 않습니다.

구분 기호가 다음과 같은 경우실제로공간, 용도

cut -d ' ' -f 1 input.txt

있는 것으로 밝혀지면많은 종류의탭 및/또는 공백은 다음을 사용하십시오 awk.

awk '{ print $1 }' input.txt

cut이 작업에는 또는 를 사용하는지 여부에 관계없이 셸 루프가 필요하지 않습니다 awk.

여러분도 구경해 보세요”쉘 루프를 사용하여 텍스트를 처리하는 것이 왜 나쁜 습관으로 간주됩니까?".


스크립트가 작동하지 않는 이유는 echo인용되지 않은 변수를 사용하면 탭이 사라지기 때문입니다.

관련된:

답변2

Tab예는 기본 구분 기호이므로 cut명시적인 매개변수를 제공할 필요가 없습니다.

그러나 탭이 공백으로 바뀌는 것을 방지하려면 변수를 인용해야 합니다.

SN=`echo "${line}"|cut -f1`

cut하지만 처음부터 사용을 피할 수도 있습니다 . IFS으로 설정하면 됩니다 \t.

IFS=$'\t'
while read -r SN rest
do 
    echo "$SN"
done < input.txt

답변3

배쉬 설명

$'\t'

탭 문자이므로

cut -d $'\t' -f 1

cut탭을 구분 기호로 사용하도록 지시하는 방법입니다(단, 기본값이므로 중복됩니다). 그러나 나는 동일한 구문을 가진 awk를 선호합니다.

awk -v FS=$'\t' '{ print $1 }' < input.txt

관련 정보