正在从 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

在这个答案中,我假设您正在寻找基于 LABNOOth_ID 列的唯一值,即数字 34

实际上要使列名保持在最前面,请使用:

# 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