【发布时间】:2020-09-29 17:39:39
【问题描述】:
我也有类似的问题:How to do filtering of multiple files in a directory using awk?
上述问题答案中的解决方案对我不起作用。
我有制表符分隔的 txt 文件(都在文件夹 Observation_by_pracid 中)。对于每个文件,我想创建一个新文件,该文件仅包含列 $9 (medcodeid) 中具有特定值的行。具体值可在 medicalcode_list.txt 中找到。 没有错误,但是它只返回空文件。
编码列表
medcodeid
2576
3199
输入文件的格式
patid consid ... medcodeid
500470520002 3062539302 ... 2576
951924020002 3062538414 ... 310803013
503478020002 3061587464 ... 257619018
951924020002 3062537807 ... 55627011
503576720002 3062537720 ... 3199
期望的输出
patid consid ... medcodeid
500470520002 3062539302 ... 2576
503576720002 3062537720 ... 3199
我的代码
mkdir HBA1C_observation_bypracid
awk '
NR==FNR {mlist[$1]; next }
FNR==1 {close(out); out="HBA1C_observation_bypracid/HBA1C_" FILENAME }
($9 in mlist) { print > out }
' PATH/medicalcode_list.txt *.txt
解决方案
mkdir HBA1C_observation_bypracid
awk '
BEGIN{ FS=OFS="\t" }
NR==FNR {mlist[$1]; next }
FNR==1 {close(out); out="HBA1C_observation_bypracid/HBA1C_" FILENAME }
($9 in mlist) { print > out }
' PATH/medicalcode_list.txt *.txt
添加“BEGIN...”解决了我的问题。
【问题讨论】:
-
没有。我只需要最有效的方法,因为需要处理大量数据。
-
如果将 $9 替换为 $NF,会得到什么?
-
您很可能在
codelist或您的输入文件(但不是两者)中遇到CRLF行尾。这意味着您尝试将2576\r与2576匹配,但这是行不通的。查看this question 了解更多信息。您可以通过cat -vET file快速检查您的文件,看看那里是否有意外情况。 -
或更简单:只需输入
file filename这将为您提供信息 -
两个文件都是 ASCI。行尾显示为 ^I
标签: awk