UNIX에서 필드 열 값을 찾고 바꾸는 방법

UNIX에서 필드 열 값을 찾고 바꾸는 방법

값이 다음과 같이 구분된 파일이 있습니다.|

123-|aaa|bbb|123|123.0|123-|123.01-|-123.02|123.03-|aaa|bbb|123-|aaa-|-bbb|cc-cc|123.04-|aa123-|123.05-

로 끝나는 열 값을 선택해야 합니다 -. 선택한 열은 숫자여야 하며 그러면 -해당 값의 시작 부분으로 이동합니다.

답변1

POSIX적으로:

sed ':1
     s/^\(.*|\)\{0,1\}\([0-9.]*[0-9][0-9.]*\)-\(|.*\)\{0,1\}$/\1-\2\3/
     t1'

또는 awk보다 직관적인 방법으로:

awk -F '|' -v 'OFS=|' '{
  for (i = 1; i <= NF; i++)
    if ($i ~ /^[0-9]*(\.[0-9]+)?-$/)
      $i = "-" substr($i, 1, length($i)-1)
  print}'

(이 버전은 더 엄격하며 다음과 같이 간주됩니다.숫자, 예를 들어 그 sed사람은 숫자로 받아들입니다).1...2

귀하의 의견을 바탕으로 다음 사항이 주어졌습니다.

-123|aaa|bbb|123|123.0|-123|-123.01|-123.02|-123.03|aaa|bbb|-123|aaa-|-bbb|cc-cc|-123.04|aa123-|-123.05

답변2

일치 항목을 줄의 시작 부분이나 구분 기호에 고정하면 됩니다. 예를 들어 GNU sed를 사용하여 정규식을 확장하면 다음과 같습니다.

sed -r ':a; s/(^|\|)([0-9.]+)-(\||$)/\1-\2\3/; ta' infile

산출:

-123|aaa|bbb|123|123.0|-123|-123.01|-123.02|-123.03|aaa|bbb|-123|aaa-|-bbb|cc-cc|-123.04|aa123-|-123.05

관련 정보