Bash 替换shell中文件所有行上的第三列

Bash 替换shell中文件所有行上的第三列,bash,shell,unix,awk,sed,Bash,Shell,Unix,Awk,Sed,我有一个包含大约60列数据的文件。该文件还有大约8000万条记录。我需要一个bash命令将第三列替换为“20190113”。我们如何确定它是第三列?它由不可打印字符“\001”分隔 因此,将文件中由特殊字符“\001”分隔的所有数据记录上的第三个字段替换为值“20190113” awk可以处理非打印字符,包括\001 $ cat -v test.in abc^Axyz^Afoo def^Awvu^Abar $ awk '{$3 = "20190113"}1' FS=$'\1' OFS=$'\1'

我有一个包含大约60列数据的文件。该文件还有大约8000万条记录。我需要一个bash命令将第三列替换为“20190113”。我们如何确定它是第三列?它由不可打印字符“\001”分隔


因此,将文件中由特殊字符“\001”分隔的所有数据记录上的第三个字段替换为值“20190113”

awk
可以处理非打印字符,包括
\001

$ cat -v test.in
abc^Axyz^Afoo
def^Awvu^Abar
$ awk '{$3 = "20190113"}1' FS=$'\1' OFS=$'\1' test.in | cat -v
abc^Axyz^A20190113
def^Awvu^A20190113
$“…”
是大多数shell支持的一种构造,允许您使用转义字符。
^A
表示
\001
字符
-v
告诉
cat
打印该字节,而不是文本非打印的
\001
字节。

不如
awk
优雅,但下面是
sed
的方法

a=$(printf "1\0012\0013\0014\0015")
# check
echo "$a" | hexdump -c
b=$(echo "$a" | sed -r 's/([^\x01]*\x01[^\x01]*\x01)[^\x01]*[^x01]/\120190113\x01/')
# check
echo "$b" | hexdump -c

您可以使用十六进制格式“\xdd”为awk指定分隔符。 只需在开始部分设置输入和输出分隔符

$ cat -v brian.txt
abc^Axyz^Afoo
def^Awvu^Abar

$ awk ' BEGIN{ FS=OFS="\x01"} { $3="20190113"; print } ' brian.txt
abcxyz20190113
defwvu20190113

$ awk ' BEGIN{ FS=OFS="\x01"} { $3="20190113"; print } ' brian.txt | cat -v
abc^Axyz^A20190113
def^Awvu^A20190113

$
您也可以尝试使用Perl

$ perl -F"\x01" -lane ' $F[2]="20190113"; print join("\x01",@F) ' brian.txt
abcxyz20190113
defwvu20190113

$ perl -F"\x01" -lane ' $F[2]="20190113"; print join("\x01",@F) ' brian.txt | cat -v
abc^Axyz^A20190113
def^Awvu^A20190113

$
这可能适用于您(GNU-sed):

这将用字符串
20190113
替换文件中每行出现的第三个与
\001
不匹配的字符

sed 's/[^[.\d1.]]*/20190113/3' file