リテラルタブと改行を使用して文字列を連結する

リテラルタブと改行を使用して文字列を連結する

タブ/スペースで区切られたファイルがあります。

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

2列です。私はこれを読むために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

私はないかなり私が正しく理解していることを確認してください。ただし、2つの列の間にリテラルタブがあることを確認したい場合は、awk1回の呼び出しでこれを行うことができます。

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

これは2つの列のみを処理しますが、最初の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

関連情報