![将 tsv 文件中特定单元格的内容替换为其他单元格编辑后的内容](https://linux22.com/image/160951/%E5%B0%86%20tsv%20%E6%96%87%E4%BB%B6%E4%B8%AD%E7%89%B9%E5%AE%9A%E5%8D%95%E5%85%83%E6%A0%BC%E7%9A%84%E5%86%85%E5%AE%B9%E6%9B%BF%E6%8D%A2%E4%B8%BA%E5%85%B6%E4%BB%96%E5%8D%95%E5%85%83%E6%A0%BC%E7%BC%96%E8%BE%91%E5%90%8E%E7%9A%84%E5%86%85%E5%AE%B9.png)
我有一个像这样的 tsv 文件:
col1 col2
etc ok
something NULL
category1 ok
randomtext NULL
我需要将“NULL”替换为左侧单元格的内容加上数字2。类似:如果单元格的内容与字符串“NULL”匹配,则将其替换为左侧单元格的内容并添加一个数字2:
col1 col2
etc ok
something something2
category1 ok
randomtext randomtext2
谢谢
答案1
和awk
:
awk 'BEGIN{ OFS="\t" } { if ($2=="NULL"){ $2=$1"2" } print }' file
如果 field$2
是NULL
,则将 field$1
和分配"2"
给 field $2
。然后打印该行。
和sed
:
sed 's/^\([^[:blank:]]*\)\([[:blank:]]*\)NULL\([[:blank:]]*\)/\1\2\12\3/' file
分三组捕获第一列、后面的空格和第二列之后的(可能的)空格,并用第一组、二组、一 + “2” 和三组替换。
答案2
使用米勒(https://github.com/johnkerl/miller) 是
mlr --tsv put -S 'if ($col2 == "NULL") {$col2 = $col1."2"}' input.tsv
答案3
基于csvsql
Python的csvkit
:
csvsql -t --query '
SELECT col1, CASE WHEN col2 IS NULL THEN col1||"2" ELSE col2 END AS col2 FROM stdin
' < file.tsv | csvformat -T
col1 col2
etc ok
something something2
category1 ok
randomtext randomtext2
答案4
使用 GNU sed 就很简单了:
$ sed -E 's/^([^\t]+)\tNULL(\t|$)/\1\t\12\2/' file