タブ/スペースで区切られたファイルがあります。
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つの列の間にリテラルタブがあることを確認したい場合は、awk
1回の呼び出しでこれを行うことができます。
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