タブで区切られた2つのファイルがあり、それぞれ2つの列があります。 2つのファイルのうち1列に要素が重なるファイルを作成したいと思います。これを行うには、まずファイル1を配列に配置し、次に配列をスキャンしてファイル2に重複する部分があることを確認します。しかし、どういうわけか配列のインデックスは認識されません。問題の詳細な説明を以下に提供する。
ファイルの最初の3行は次のとおりです。
ファイル1:
90001 raw acceleration data
2634 Heavy DIY
1011 Light DIY
ファイル2:
2634 218263
25680 44313
25681 44313
2つのファイルの列1に重複があることを示すには、次のようにします。
user@cluster:~> grep 90001 file2
90001 103662
user@cluster:~> grep 2634 file2
2634 218263
ファイル3を作成するために最初にこれを試しましたが、結果として空のファイルが作成されました。
awk 'BEGIN {FS = "\t"; OFS= "\t"}
NR==FNR {a[$1]=$2; next}
{ if($1 in a) print $1, a[$1]}' file1 file2 > file3
else
次のコードは、その行を追加すると実際にはfile2をfile3に印刷するため、配列のインデックスが認識されないという問題があることを確認します。
awk 'BEGIN {FS = "\t"; OFS= "\t"}
NR==FNR {a[$1]=$2; next}
{if($1 in a)
print $1, a[$1]
else
print $1, $2}' file1 file2 > file3
混乱しています。この問題の原因と解決策を知りたいです。よろしくお願いします。
答え1
~からあなたのコメント:
これは出力の最初の行です。
90001\r\traw acceleration data$
最初のフィールドは入力のフィールドに合わせて変更しないでください。または、スクリプトの先頭に追加するか、同様の内容を削除して90001\r
削除します。90001
FS = "\t"
FS = "\r?\t"
\r
{ sub(/\r/,"") }
バラより私のツール出力がそれ自体で上書きされる理由と回避策\r
入力ファイルのs(キャリッジリターン)に関する追加情報。通常、中間ではなく行の末尾にあります。現在の問題は、前の手順でフィールドの順序を変更したりファイルを削除したりするのではなく、以前のバージョンのファイルの各行の末尾に文字列を追加した結果です。オフ\r
。
さて、次のように書いてみてください。
if($1 in a)
print $1, a[$1]
else
print $1, $2
として三項式:
print $1, ($1 in a ? a[$1] : $2)
多くのコードを書いて重複を避けるためにprint $1,
。また、これを変更することを検討してください。
FS = "\t"; OFS= "\t"
これに関して:
FS=OFS="\t"
同じ理由で - 重複が少なく、コードがよりきれいです。