用Unix替换csv文件中多列中的特定值[已关闭]

a1o7rhls  于 2023-03-27  发布在  Unix
关注(0)|答案(3)|浏览(154)

已关闭。此问题需要超过focused。当前不接受答案。
**想要改进此问题吗?**更新此问题,使其仅关注editing this post的一个问题。

2天前关闭。
Improve this question
我在一个csv文件中有1000列,我想将每个单元格中的值“2008”替换为“1”,而其他不包括“2008”的单元格应该是“0”。我该怎么做?
我有什么:
| 第1栏|......第1000列|
| --------------|--------------|
| 二零零八年|2014年|
| 二○一○年|二零零八年|
期望输出:
| 第1栏|...第1000列|
| --------------|--------------|
| 1|0|
| 0|1|

yk9xbfzb

yk9xbfzb1#

有很多方法可以做到这一点,但其中一种方法是使用sed命令:
sed -i 's/2008/1/g' yourFile.csv

  • -i意味着in-place,这意味着您的文件将立即被编辑。
  • s/...用于替换
  • 末尾的g用于全局。sed的默认行为是编辑该行,并在第一个匹配项处停止,然后从下一行开始。通过在末尾添加g,您将告诉sed沿着该行继续下去,并对每个匹配项进行更改

注意:Bash是相当无情的。开始尝试使用它的一个好方法是在尝试编辑文件之前备份文件。在bash中没有Ctrl+z进行文件编辑。

64jmpszr

64jmpszr2#

支持像12008这样的字段比所有字段都是最多4位数的数字时更复杂:

sed -r 's/2008/a/g; s/[0-9]+/0/g; s/a/1/g' file

如果没有字段的限制,请使用awk

vkc1a9a2

vkc1a9a23#

假设:

  • 不等于4位数2008的任何字段将更改为0(例如,920089abc2008def将更改为0

示例数据文件:

$ cat test.csv
Column1 Column2 Column3
2008    2014    920089
2010    2008    abc2008def

一个awk的想法:

awk '
BEGIN { FS=OFS="\t" }                        # define input/output field delimiter as tab
NR>1  { for (i=1;i<=NF;i++)                  # for all but header row (NR>1), loop through all fields and ...
            $i= ($i=="2008") ? 1 : 0         # redefine field based on whether or not equal to "2008"
      }
1                                            # print current row
' test.csv

##########
# or: as a one-liner sans comments

awk 'BEGIN {FS=OFS="\t"} NR>1 {for (i=1;i<=NF;i++) $i= ($i=="2008") ? 1 : 0} 1' test.csv

这将产生:

Column1 Column2 Column3
1       0       0
0       1       0

相关问题