与えられた列の長さだけを切り取る方法は?

与えられた列の長さだけを切り取る方法は?

入力する:

a@notebook:~$ cat in.csv
'XYZ843141'^'ASDFSAFXYVFSHGDSDg sdGDS  dsGDSgfa assfd faSDFAS saDFSAFD adFSA343fa sdfSADF'^'BAAAR'^'YYY'^'..... and so on, further columns
'YYZ814384'^'ASfdEtRiuognfnseaFREQTzKb   aSFfdsaADSFSA  adsFdsa34 34 ASFfsas  saftrzj etrzrasdfasffasf safs'^'foooobaaar'^'ZZZ'^'..... and so on, further columns

出力:

a@notebook:~$ cat in.csv | SOMEMAGIC
'XYZ843141'^'ASDFSAFXYVFSHGDSDg s'^'BAAAR'^'YYY'^'..... and so on, further columns
'YYZ814384'^'ASfdEtRiuognfnseaFRE'^'foooobaaar'^'ZZZ'^'..... and so on, further columns

私の質問:もし:

'^'

は区切り記号です。それでは、SOMEMAGIC(awk / sed?)は2番目の列を与えられた長さにどのように切り捨てますか?例:最大20文字:

ASDFSAFXYVFSHGDSDg sdGDS  dsGDSgfa assfd faSDFAS saDFSAFD adFSA343fa sdfSADF

これに関して:

ASDFSAFXYVFSHGDSDg s

残りはすべて維持します。\

答え1

> awk -v OFS="'^'" -F"'\\\\^'" '{if(length($2)>20) $2=substr($2,1,20); print;}' file
'XYZ843141'^'ASDFSAFXYVFSHGDSDg s'^'BAAAR'^'YYY'^'..... and so on, further columns
'YYZ814384'^'ASfdEtRiuognfnseaFRE'^'foooobaaar'^'ZZZ'^'..... and so on, further columns

答え2

以下は、文字列からわずか20文字を取得する簡単なsedの例です。

$ str = "ASDFSAFXYVFSHGDSDg sdGDS  dsGDSgfa assfd faSDFAS saDFSAFD adFSA343fa sdfSADF"

$ echo $str | sed -e 's/^\(.\{20\}\).*/\1/'
ASDFSAFXYVFSHGDSDg s

または切る注文する:

$ echo $str | cut -c 1-20

編集:これはどうですか?

$ echo $str | awk -F "^" '{print $1,$2}'
'XYZ843141' 'ASDFSAFXYVFSHGDSDg s'

答え3

次のことを試すことができます。

paste -d^ <(cut -f1 -d^ in.csv) \
          <(cut -f2 -d^ in.csv | sed -e 's/^\(.\{21\}\).*/\1'\''/')\
          <(cut -f3- -d^ in.csv)

^ただし、一部のフィールドがあると失敗します。

関連情報