awkは配列インデックスを認識できません

awkは配列インデックスを認識できません

タブで区切られた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削除します。90001FS = "\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"

同じ理由で - 重複が少なく、コードがよりきれいです。

おすすめ記事