使用文字制表符和换行符连接字符串

使用文字制表符和换行符连接字符串

我有一个制表符/空格分隔的文件:

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

shellread命令可以读取多个变量。您需要将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

相关内容