2016-06-30 18 views
-4

私はいくつかのファイルを持っています。それぞれのカラムとカラムごとに異なるセパレータ(コンマ、スペース、タブ)があります。私は、特定の列のすべての行の最初の10文字を削除する必要があります。例えば、sedの/ ..........//はこのトリックを行うことができますが、私が望むカラムを指定するにはどうしたらいいですか、ファイルのセパレータをどのように指定することができますか?おそらくawkでそれをやる方が簡単でしょうか? awkではカラムを指定する方法を知っていますが、最初の10文字を消去する方法はわかりません。ありがとう。ファイル内の文字を削除します(bash)。

+2

例を挙げてお答えください。 – armandino

+2

入力例出力。 –

+0

awkは 'substr()'関数を利用できます。あなたは 'awk '{$ 3 = substr($ 3,1,10); print $ 0}'のようなことをすることができます(明らかにフィールド3を仮定します)。すべてのawk文字列関数が説明されている[この素敵なページ](https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html)をチェックしてください。 – JNevill

答えて

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 
4

フィールドの最初の10個の文字を消去する方法をあなたの質問の最初の部分、1つの方法は、このようなものです:10文字以下で

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

フィールドは空になってしまいます。

第二には、あなたが出力に同じ区切りを維持したいと仮定すると、フィールドセパレータを指定するには、それはBEGINブロックを使用し、FSOFS内蔵でawkの変数を設定するのが最善です。この例では

我々はカンマで区切られたレコードの第2フィールドから最初の10個の文字を削除します(タブ区切りの場合:BEGIN {FS=OFS="\t"}

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

関連する問題