我有一个制表符/空格分隔的文件:
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