替换外壳中文件的所有行上的第三列

时间:2019-01-22 20:10:18

标签: bash shell unix awk sed

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

分隔

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

4 个答案:

答案 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不匹配的那些字符的第三次出现。