从一个文件中提取数据并根据一列值放置在不同的文件中

use*_*123 18 csv split

我们将生成一个具有以下值的 csv 文件

yp1234,577,1,3
yp5678,577,3,5
yp9012,132,8,9
Run Code Online (Sandbox Code Playgroud)

我需要根据第二列提取数据并创建文件。如果是 577,则必须提取整行并将其放置在单独的文件中。我的意思是我需要一个文件的第二列单独为 577,另一个文件的第二列单独为 132

我尝试使用 IF 但没有用

ter*_*don 35

使用awk

awk -F, '{ print > $2 ".csv" }' file.csv
Run Code Online (Sandbox Code Playgroud)

这将创建两个文件577.csv,并132.csv在当前目录。

上面的命令假设您只能将132577作为第二个字段。它将为整个 .csv 文件的第二个字段中找到的每个值创建一个文件名file.csv

如果除了您感兴趣的两个值之外还有其他值,并且您想忽略这些行,请改为执行以下操作:

awk -F, '$2 == "577" || $2 == "132" { print > $2 ".csv" }' file.csv
Run Code Online (Sandbox Code Playgroud)

  • 有一些错误的 `awk` 实现不能使用 `print > $2 ".cvs"`。对于那些,您必须首先计算文件名,然后执行`print`:`fname = $2 ".cvs"; 打印> fname`。 (2认同)

X T*_*ian 3

将所有 577 提取到标准输出

grep -e '^.*,577,.*,.*$' youfile.csv >result_extract_557.csv
Run Code Online (Sandbox Code Playgroud)

-- 编辑 1 根据下面 @terdon 的评论进行更正,以避免当至少 3 个逗号与 577 一致时出现错误匹配。

grep -e '^[:alnum:]*,577,[:digit:]*,[:digit:]*$' youfile.csv >result_extract_557.csv
Run Code Online (Sandbox Code Playgroud)

但我认为他/她的awk解决方案更全面。