>

다음과 같이 여러 줄이있는 파일을 처리하기 위해 2 개의 charachter delimeter로 cut to를 사용하고 싶습니다.

1F3C6..1F3CA
1F3CF..1F3D3
1F3E0..1F3F0

하지만 잘라내 기는 한 문자 만 허용합니다.

cut -d'..' 대신

 나는 awk -F'..' "{echo $1}" 를 시도하고있다  하지만 작동하지 않습니다.

내 스크립트 :

wget -O output.txt http://www.unicode.org/Public/emoji/6.0/emoji-data.txt                                                                             
sed -i '/^#/ d' output.txt                        # Remove comments                                                                                   
cat output.txt | cut -d' ' -f1 | while read line ;                                                                                                    
  do echo $line | awk -F'..' "{echo $1}"                                                                                                             
done 

  • 답변 # 1

    나에게 적합한 샘플 테스트 스크립트 :

    #!/bin/sh
    raw="1F3C6..1F3CA
    1F3CF..1F3D3
    1F3E0..1F3F0"
    for r in $raw
    do
        f1=`echo "${r}" | cut -d'.' -f1`
        f2=`echo "${r}" | cut -d'.' -f2`
        f3=`echo "${r}" | cut -d'.' -f3`
        echo "field 1:[${f1}] field 2:[${f2}] field 3:[${f3}]"
    done
    exit
    
    

    그리고 출력은 :

    field 1:[1F3C6] field 2:[] field 3:[1F3CA]
    field 1:[1F3CF] field 2:[] field 3:[1F3D3]
    field 1:[1F3E0] field 2:[] field 3:[1F3F0]
    
    

    수정

    Stéphane Chazelas 의견을 읽고 Q&A를 링크 한 후 위의 내용을 다시 작성하여 loop 를 제거했습니다. .

    loop 를 제거하는 방법을 찾지 못했습니다  부분을 변수로 유지 (예 : $f1 ) $f2  그리고 $f3  내 원래 답변에서) 전달 될 수 있습니다. 여전히 원래 질문에 무엇이 필요한지 알 수 없습니다.

    먼저 cut 를 사용합니다 :

    #!/bin/sh
    raw="1F3C6..1F3CA
    1F3CF..1F3D3
    1F3E0..1F3F0"
    printf '%s\n' "${raw}" | cut -d'.' -f1,3
    
    

    어떤 것을 출력 할 것인가 :

    1F3C6.1F3CA
    1F3CF.1F3D3
    1F3E0.1F3F0
    
    

    표시된 . 를 교체 할 수 있습니다   --output-delimiter=STRING 를 사용하는 문자열 .

    다음으로 sed   cut 대신  출력을보다 세밀하게 제어하려면 :

    #!/bin/sh
    raw="1F3C6..1F3CA
    1F3CF..1F3D3
    1F3E0..1F3F0"
    printf '%s\n' "${raw}" | sed 's/^\(.*\)\.\.\(.*\)$/field 1 [\1] field 2 [\2]/'
    
    

    이것이 렌더링됩니다 :

    field 1 [1F3C6] field 2 [1F3CA]
    field 1 [1F3CF] field 2 [1F3D3]
    field 1 [1F3E0] field 2 [1F3F0]
    
    

  • 답변 # 2

    awk 의 필드 구분 기호는 두 문자 이상인 경우 정규 표현식으로 처리됩니다. 와이즈 비즈  정규 표현식으로, 2자를 의미합니다. 그 .. 를 탈출해야합니다   . 와 함께  또는 [.] .

    \.
    
    

    (백 슬래시 자체도 awk -F'[.][.]' ... awk -F'\\.\\.' ... 에 대해 (최소 gawk와 같은 awk로) 이스케이프해야 함) / \n  확장 \b 에 대한 주장  ).

    귀하의 경우 :

    -F
    
    

    어쨌든, 텍스트를 처리하기 위해 쉘 루프를 피하십시오. awk -F' +|[.][.]' '/^[^#]/{print $1}' < output.txt  그 read , 그런 식으로 사용되지 않습니다  임의의 데이터에 사용해서는 안되며 변수를 인용해야합니다.

  • 답변 # 3

    IFS를 사용하여 각 선을 분할하여 두 점 사이의 필드를 버릴 수 있습니다.

    echo
    
    

    실행 :

    #/bin/sh
    while IFS=\. read a _ b
    do
         echo "field one=[$a] field two=[$b]"
    done < "file"
    
    

    파일이 다음과 같다고 가정 :

    $ ./script
    field one=1F3C6 field two=1F3CA
    field one=1F3CF field two=1F3D3
    field one=1F3E0 field two=1F3F0
    
    
    $ cat file 1F3C6..1F3CA 1F3CF..1F3D3 1F3E0..1F3F0

  • 이전 posix - sed의 'i \'명령에 대한 인수를 들여 쓰는 것이 이식 가능합니까?
  • 다음 ubuntu - 매일 "Carbon"이라는 이름의 이상한 서비스가 100 % CPU를 차지합니다