리터럴 탭과 줄 바꿈을 사용하여 문자열 연결

리터럴 탭과 줄 바꿈을 사용하여 문자열 연결

탭/공백으로 구분된 파일이 있습니다.

31000BL        50014_10011 
25467BL        50050_10003 
47406BL        50001_10015 
40831BL        50114_10006 
40830BL        50114_10009

두 개의 열입니다. 나는 이것을 읽기 위해 while 루프를 사용합니다:

while read LINE; do 
    printf "$LINE\n" 
    old=($(echo $LINE | awk '{print $1}')) 
    new=($(echo $LINE | awk '{print $2}'))  
    ll=$old'^V<tab>'$new                  #I need to work here.   
    printf "$ll\n" 
done < update_ids.txt

내가 원하는 출력은

31000BL\t50014_10011\n25467BL\t50050_10003\n

리터럴 탭과 개행 문자가 있습니다. 탭 및/또는 줄 바꿈을 사용하여 연결하거나 인쇄할 수 없습니다.

답변1

난 아니다상당히제가 정확하게 이해했는지 확인하세요. 하지만 두 열 사이에 리터럴 탭이 있는지 확인하고 싶다면 awk한 번의 호출로 이 작업을 수행할 수 있습니다.

awk -v OFS='\t' '{ $1=$1; print }' file >newfile

OFS\t출력 필드 구분 기호를 탭으로 설정 하려면 명령줄에서 설정하세요 . 을 사용하면 현재 레코드가 $1=$1강제로 awk다시 구성되고, 후속 레코드는 print원래 구분 기호로 사용되었던 공백이 탭으로 대체되어 인쇄됩니다.

newfile결과는 리디렉션을 사용하여 기록됩니다.

또는 보다 명시적인 printf()호출을 사용하십시오.

awk '{ printf("%s\t%s\n", $1, $2) }' file >newfile

이는 두 개의 열만 처리하는 반면 첫 번째 awk프로그램은 수정 없이 여러 열이 있는 데이터를 처리합니다.

질문과 관련:

답변2

read명령은 여러 변수를 읽을 수 있습니다. IFS변수를 탭으로 설정 해야 합니다 . 이는 bash에서 작동합니다.ANSI-C 인용문:IFS=$'\t'

출력의 경우 printf내장 명령이 원하는 것입니다.

while IFS=$'\t' read -r old new; do 
    printf '%s\t%s\n' "$old" "$new"
done < update_ids.txt

탭으로 구분된 데이터를 변수에 저장하려면 다음을 수행할 수 있습니다.

var=$(printf '%s\t%s\n' "$old" "$new")
# or
printf -v var '%s\t%s\n' "$old" "$new"
# or this quoting disaster
var="$old"$'\t'"$new"

인용하다:https://www.gnu.org/software/bash/manual/bashref.html#index-printf

관련 정보