我有一个包含约60列数据的文件。该文件也大约有8000万条记录。我需要一个bash命令用'20190113'替换第三列。我们如何确定它是第三列?它由不可打印字符'\ 001'
分隔因此,将文件中所有数据记录的第三个字段替换为以特殊字符'\ 001'分隔的值'20190113;
答案 0 :(得分:3)
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
字节。
答案 1 :(得分:0)
不如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
答案 2 :(得分:0)
您可以使用十六进制格式“ \ xdd”来指定awk的分隔符。 只需在BEGIN部分中设置输入和输出分隔符即可。
ST
您也可以尝试使用Perl
$ 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
$
答案 3 :(得分:0)
这可能对您有用(GNU sed):
java.lang.IllegalArgumentException: org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list [FromElement{explicit,not a collection join,fetch join,fetch non-lazy properties,classAlias=vd,role=com.katariasoft.technologies.jpaHibernate.college.data.entity.Vehicle.documents,tableName=document,tableAlias=documents3_,origin=vehicle vehicles2_,columns={vehicles2_.id ,className=com.katariasoft.technologies.jpaHibernate.college.data.entity.utils.Document}}] [ select i from com.katariasoft.technologies.jpaHibernate.college.data.entity.Instructor i join fetch i.idProof id left join i.vehicles v join fetch v.documents vd ]
这将在文件的每一行中用字符串sed 's/[^[.\d1.]]*/20190113/3' file
替换与字符串\001
不匹配的那些字符的第三次出现。