탭/공백으로 구분된 파일이 있습니다.
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