Bash 替换shell中文件所有行上的第三列
我有一个包含大约60列数据的文件。该文件还有大约8000万条记录。我需要一个bash命令将第三列替换为“20190113”。我们如何确定它是第三列?它由不可打印字符“\001”分隔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'
因此,将文件中由特殊字符“\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