【问题标题】:Recode value in the column in unix with awk or sed使用 awk 或 sed 在 unix 中重新编码列中的值
【发布时间】:2021-11-02 09:16:11
【问题描述】:

在以下文件中,第 6 列中值不是 1 或 2 的行的第 6 列值应替换为 -9。我该怎么做?
旧.fam

18_0033 26210 0 0 1 1
18_0036 24595 0 0 1 2
18_0040 25563 0 0 1 
18_0041 35990 0 0 0 -8
18_0042 39398 0 0 0 -8
18_0045 21586 0 0 1 1
18_0050 22211 0 0 1 2

new.fam 应该是

18_0033 26210 0 0 1 1
18_0036 24595 0 0 1 2
18_0040 25563 0 0 1 -9
18_0041 35990 0 0 0 -9
18_0042 39398 0 0 0 -9
18_0045 21586 0 0 1 1
18_0050 22211 0 0 1 2

编辑:我用cat old.fam | awk '{ if ($6==1 || $6==2) {print $1 " " $2 " " $3 " " $4 " " $5 " " $6 ;} else {print $1 " " $2 " " $3 " " $4 " " $5 " " -9;}}'> new.fam

现在的问题是第 6 列值 (-9) 被替换的行,第 5 列和第 6 列之间没有空格分隔 FS。

18_0033 26210 0 0 1 1
18_0036 24595 0 0 1 2
18_0040 25563 0 0 1-9
18_0041 35990 0 0 0-9
18_0042 39398 0 0 0-9
18_0045 21586 0 0 1 1
18_0050 22211 0 0 1 2

【问题讨论】:

  • 看起来像 awksed 的典型案例,网站上有很多关于这些命令的帖子。
  • 我找不到任何适合初学者的基本帖子。你能引导我去那个_吗?

标签: linux shell unix


【解决方案1】:

您可以在这里开始工作:

cat test.txt | awk '{if ($6==1||$6==2) {print $1 " " $6;} else {print $1 " -9";}}'

awk 脚本执行以下操作:

  • 检查第六列的值
  • 在两次检查之间,有 awk || 逻辑 OR 运算符

脚本的其余部分很明显。

编辑
显然awk 不能处理空格,后跟数字,所以你可以使用这个awk 脚本:

awk '{ if ( $6==1|| $6==2) {print $1 " " $2 " " $3 " " $4 " " $5 " " $6 ;} else 
                           {print $1 " " $2 " " $3 " " $4 " " $5 " -9";}}'

(注意最后的$5 " -9"

【讨论】:

  • 这只是打印文件的第 1 列和第 6 列。虽然我需要所有列。
  • 我只是给你一个先机,其余的由你决定:-)
  • 我用过 cat test.fam | awk '{ if ($6==1 || $6==2) {打印 $1 " " $2 " " $3 " " $4 " " $5 " " $6 ;} else {打印 $1 " " $2 " " $3 " " $4 " " $5 " " -9;}}'> new.fam
  • 我现在面临的问题是新文件中第 5 列和第 6 列之间的 FS 没有像原始文件那样用空格分隔。你能告诉我我哪里错了吗?
  • @Aryh:你能编辑你原来的问题并显示你目前的结果吗? (我期待您的命令能够完美运行)
猜你喜欢
  • 1970-01-01
  • 2011-04-07
  • 2017-07-13
  • 2012-01-24
  • 1970-01-01
  • 2015-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多