正在从 Linux 中的文件中删除特定 lines/rows 或重复项
Removing specific lines/rows or duplicates from a file in Linux
我想使用特定变量 'SAMPLE' 下的值从 Linux 的 .csv 文件(名为 'mydata')中删除特定行。我的文件中实际上有 250 个重复项,原始文件有 15000 行和 66 列,我想删除每个重复项的一个副本并保留一个。如果您查看其他变量,例如 'ID',您会发现那里有重复项。因此,如果我可以根据 'SAMPLE' 列中的值删除重复项或特定行,任何解决方案都适合我。 SAMPLE 是我的数据中唯一重复名称不相同的列。我的数据是这样的;
ID SAMPLE LABNO Oth_ID sex age bmi ca_1 pd_7
1003341 21863 21863 NA 1 48.68 22.42 0 0
1003343 22697 22697 NA 1 48.98 23.25 0 0
1003347 4421 4421 NA 1 48.70 25.56 NA NA
1003348 1642 1642 NA 1 48.72 16.57 NA NA
1003349 4163 4163 6069 1 49.02 23.47 1 NA
1003349 6069 4163 6069 1 49.02 23.47 1 NA
1003356 5347 9053 5347 1 49.08 24.81 0 0
1003356 9053 9053 5347 1 49.08 24.81 0 0
1003357 695 695 NA 1 49.08 22.32 NA NA
1003360 19833 19833 NA 1 48.55 22.48 0 0
1003365 5392 6843 5392 1 48.70 23.08 0 0
1003365 6843 6843 5392 1 48.70 23.08 0 0
您可以使用简单的 sort
命令。只需使用 -k
键定义适当的列并添加 -u
选项以使结果集唯一:
sort -k 3,4 -u < mydata.csv
在这个答案中,我假设您正在寻找基于 LABNO
和 Oth_ID
列的唯一值,即数字 3
和 4
。
实际上要使列名保持在最前面,请使用:
# Write the top line to the new file
head -n 1 mydata.csv > mydata.uniq.csv
# Make unique, sort and append other lines
tail -n +2 mydata.csv | sort -k 3,4 -u | sort -V >> mydata.uniq.csv
之前:
ID SAMPLE LABNO Oth_ID sex age bmi ca_1 pd_7
1003341 21863 21863 NA 1 48.68 22.42 0 0
1003343 22697 22697 NA 1 48.98 23.25 0 0
1003347 4421 4421 NA 1 48.70 25.56 NA NA
1003348 1642 1642 NA 1 48.72 16.57 NA NA
1003349 4163 4163 6069 1 49.02 23.47 1 NA
1003349 6069 4163 6069 1 49.02 23.47 1 NA
1003356 5347 9053 5347 1 49.08 24.81 0 0
1003356 9053 9053 5347 1 49.08 24.81 0 0
1003357 695 695 NA 1 49.08 22.32 NA NA
1003360 19833 19833 NA 1 48.55 22.48 0 0
1003365 5392 6843 5392 1 48.70 23.08 0 0
1003365 6843 6843 5392 1 48.70 23.08 0 0
之后:
ID SAMPLE LABNO Oth_ID sex age bmi ca_1 pd_7
1003341 21863 21863 NA 1 48.68 22.42 0 0
1003343 22697 22697 NA 1 48.98 23.25 0 0
1003347 4421 4421 NA 1 48.70 25.56 NA NA
1003348 1642 1642 NA 1 48.72 16.57 NA NA
1003349 4163 4163 6069 1 49.02 23.47 1 NA
1003356 5347 9053 5347 1 49.08 24.81 0 0
1003357 695 695 NA 1 49.08 22.32 NA NA
1003360 19833 19833 NA 1 48.55 22.48 0 0
1003365 5392 6843 5392 1 48.70 23.08 0 0
@zinovyev 的代码对我来说工作正常。 @Tabbi,要解决您的问题,运行 下面的 remove_dup.sh 脚本(一个文件中的代码 + 数据):
#!/bin/bash
# Write the top line
sed '0,/^__DATA__$/d' "[=10=]" | head -n 1
# Make unique, sort and append other lines
sed '0,/^__DATA__$/d' "[=10=]" | tail -n +2 | sort -k 3,4 -u | sort -V
exit
__DATA__
ID SAMPLE LABNO Oth_ID sex age bmi ca_1 pd_7
1003341 21863 21863 NA 1 48.68 22.42 0 0
1003343 22697 22697 NA 1 48.98 23.25 0 0
1003347 4421 4421 NA 1 48.70 25.56 NA NA
1003348 1642 1642 NA 1 48.72 16.57 NA NA
1003349 4163 4163 6069 1 49.02 23.47 1 NA
1003349 6069 4163 6069 1 49.02 23.47 1 NA
1003356 5347 9053 5347 1 49.08 24.81 0 0
1003356 9053 9053 5347 1 49.08 24.81 0 0
1003357 695 695 NA 1 49.08 22.32 NA NA
1003360 19833 19833 NA 1 48.55 22.48 0 0
1003365 5392 6843 5392 1 48.70 23.08 0 0
1003365 6843 6843 5392 1 48.70 23.08 0 0
你应该会看到结果
ID SAMPLE LABNO Oth_ID sex age bmi ca_1 pd_7
1003341 21863 21863 NA 1 48.68 22.42 0 0
1003343 22697 22697 NA 1 48.98 23.25 0 0
1003347 4421 4421 NA 1 48.70 25.56 NA NA
1003348 1642 1642 NA 1 48.72 16.57 NA NA
1003349 4163 4163 6069 1 49.02 23.47 1 NA
1003356 5347 9053 5347 1 49.08 24.81 0 0
1003357 695 695 NA 1 49.08 22.32 NA NA
1003360 19833 19833 NA 1 48.55 22.48 0 0
1003365 5392 6843 5392 1 48.70 23.08 0 0
我想使用特定变量 'SAMPLE' 下的值从 Linux 的 .csv 文件(名为 'mydata')中删除特定行。我的文件中实际上有 250 个重复项,原始文件有 15000 行和 66 列,我想删除每个重复项的一个副本并保留一个。如果您查看其他变量,例如 'ID',您会发现那里有重复项。因此,如果我可以根据 'SAMPLE' 列中的值删除重复项或特定行,任何解决方案都适合我。 SAMPLE 是我的数据中唯一重复名称不相同的列。我的数据是这样的;
ID SAMPLE LABNO Oth_ID sex age bmi ca_1 pd_7
1003341 21863 21863 NA 1 48.68 22.42 0 0
1003343 22697 22697 NA 1 48.98 23.25 0 0
1003347 4421 4421 NA 1 48.70 25.56 NA NA
1003348 1642 1642 NA 1 48.72 16.57 NA NA
1003349 4163 4163 6069 1 49.02 23.47 1 NA
1003349 6069 4163 6069 1 49.02 23.47 1 NA
1003356 5347 9053 5347 1 49.08 24.81 0 0
1003356 9053 9053 5347 1 49.08 24.81 0 0
1003357 695 695 NA 1 49.08 22.32 NA NA
1003360 19833 19833 NA 1 48.55 22.48 0 0
1003365 5392 6843 5392 1 48.70 23.08 0 0
1003365 6843 6843 5392 1 48.70 23.08 0 0
您可以使用简单的 sort
命令。只需使用 -k
键定义适当的列并添加 -u
选项以使结果集唯一:
sort -k 3,4 -u < mydata.csv
在这个答案中,我假设您正在寻找基于 LABNO
和 Oth_ID
列的唯一值,即数字 3
和 4
。
实际上要使列名保持在最前面,请使用:
# Write the top line to the new file
head -n 1 mydata.csv > mydata.uniq.csv
# Make unique, sort and append other lines
tail -n +2 mydata.csv | sort -k 3,4 -u | sort -V >> mydata.uniq.csv
之前:
ID SAMPLE LABNO Oth_ID sex age bmi ca_1 pd_7
1003341 21863 21863 NA 1 48.68 22.42 0 0
1003343 22697 22697 NA 1 48.98 23.25 0 0
1003347 4421 4421 NA 1 48.70 25.56 NA NA
1003348 1642 1642 NA 1 48.72 16.57 NA NA
1003349 4163 4163 6069 1 49.02 23.47 1 NA
1003349 6069 4163 6069 1 49.02 23.47 1 NA
1003356 5347 9053 5347 1 49.08 24.81 0 0
1003356 9053 9053 5347 1 49.08 24.81 0 0
1003357 695 695 NA 1 49.08 22.32 NA NA
1003360 19833 19833 NA 1 48.55 22.48 0 0
1003365 5392 6843 5392 1 48.70 23.08 0 0
1003365 6843 6843 5392 1 48.70 23.08 0 0
之后:
ID SAMPLE LABNO Oth_ID sex age bmi ca_1 pd_7
1003341 21863 21863 NA 1 48.68 22.42 0 0
1003343 22697 22697 NA 1 48.98 23.25 0 0
1003347 4421 4421 NA 1 48.70 25.56 NA NA
1003348 1642 1642 NA 1 48.72 16.57 NA NA
1003349 4163 4163 6069 1 49.02 23.47 1 NA
1003356 5347 9053 5347 1 49.08 24.81 0 0
1003357 695 695 NA 1 49.08 22.32 NA NA
1003360 19833 19833 NA 1 48.55 22.48 0 0
1003365 5392 6843 5392 1 48.70 23.08 0 0
@zinovyev 的代码对我来说工作正常。 @Tabbi,要解决您的问题,运行 下面的 remove_dup.sh 脚本(一个文件中的代码 + 数据):
#!/bin/bash
# Write the top line
sed '0,/^__DATA__$/d' "[=10=]" | head -n 1
# Make unique, sort and append other lines
sed '0,/^__DATA__$/d' "[=10=]" | tail -n +2 | sort -k 3,4 -u | sort -V
exit
__DATA__
ID SAMPLE LABNO Oth_ID sex age bmi ca_1 pd_7
1003341 21863 21863 NA 1 48.68 22.42 0 0
1003343 22697 22697 NA 1 48.98 23.25 0 0
1003347 4421 4421 NA 1 48.70 25.56 NA NA
1003348 1642 1642 NA 1 48.72 16.57 NA NA
1003349 4163 4163 6069 1 49.02 23.47 1 NA
1003349 6069 4163 6069 1 49.02 23.47 1 NA
1003356 5347 9053 5347 1 49.08 24.81 0 0
1003356 9053 9053 5347 1 49.08 24.81 0 0
1003357 695 695 NA 1 49.08 22.32 NA NA
1003360 19833 19833 NA 1 48.55 22.48 0 0
1003365 5392 6843 5392 1 48.70 23.08 0 0
1003365 6843 6843 5392 1 48.70 23.08 0 0
你应该会看到结果
ID SAMPLE LABNO Oth_ID sex age bmi ca_1 pd_7
1003341 21863 21863 NA 1 48.68 22.42 0 0
1003343 22697 22697 NA 1 48.98 23.25 0 0
1003347 4421 4421 NA 1 48.70 25.56 NA NA
1003348 1642 1642 NA 1 48.72 16.57 NA NA
1003349 4163 4163 6069 1 49.02 23.47 1 NA
1003356 5347 9053 5347 1 49.08 24.81 0 0
1003357 695 695 NA 1 49.08 22.32 NA NA
1003360 19833 19833 NA 1 48.55 22.48 0 0
1003365 5392 6843 5392 1 48.70 23.08 0 0