删除文件中的字符(bash)。

时间:2016-06-30 18:08:45

标签: bash awk sed

我有几个文件,每列有不同的列和不同的分隔符(逗号,空格和制表符)。我需要删除特定列的所有行的前10个字符。我知道例如sed的/ .........。//'可以做到这一点,但是,我怎样才能指出我想要的列,以及如何指定文件的分隔符。也许用awk更容易做到这一点?使用awk我知道如何指定列但不知道如何擦除前10个字符。谢谢。

2 个答案:

答案 0 :(得分:4)

问题的第一部分,如何删除字段的前10个字符,单向是这样的:

$ echo 1234567890ABCDEF | awk '{$1=substr($1,11)}1'
ABCDEF

字符数不超过10个字段的字段将为空。

其次,要指定字段分隔符,假设您希望在输出中保留相同的分隔符,最好使用BEGIN块并设置FSOFS在awk变量中。

在此示例中,我们从逗号分隔记录的第二个字段中删除前10个字符:

$ echo field1,1234567890ABCDEF,field3 | awk 'BEGIN {FS=OFS=","} {$2=substr($2,11)}1'
field1,ABCDEF,field3

(对于制表符分隔:BEGIN {FS=OFS="\t"}

答案 1 :(得分:1)

FS中定义前移除功能和更多分隔符:

$ cat > test.in # \t below is really a tab
12345678901 2,3\t4

$ cat > test.awk
function ftrunc(str) {  # this function removes up to 10 first chars of a named field
  gsub(/^.{1,10}/,"",str)
  return str
}
BEGIN {
FS="[, \t]"             # look at me! look at me! look at me!
OFS="|"
}
{
    print ftrunc($1),ftrunc($2),$3,$4
}

$ awk -f test.awk test.in
1||3|4