텍스트 파일의 특정 필드 범위 선택

텍스트 파일의 특정 필드 범위 선택

텍스트 파일이 있습니다Filenr.lis, 포함하는

#  1  2016-05-31-1003-57S._BKSR_003_CM6
#  2  2016-06-01-2255-54S._BKSR_003_CM6
#  3  2016-06-05-1624-57S._BKSR_003_CM6
#  4  2016-06-07-1914-55S._BKSR_003_CM6
.
.
.

등.

내 출력은 다음과 같아야합니다

2016-05-31-10-03
2016-06-01-22-55
2016-06-01-22-55
2016-06-07-19-14

이것을 시도했지만 해당 형식이 없습니다.

awk -F'-' '{print "2016""-"$2"-"$3"-"$4}' filenr.lis

답변1

awk '{print substr($3,0,13)"-"substr($3,14,2)}' file.txt
2016-05-31-10-03
2016-06-01-22-55
2016-06-05-16-24
2016-06-07-19-14

sed

sed 's/^......\(.............\)\(..\).*/\1-\2/' file.txt

sed, 하지만 좀 더 똑똑해졌어

sed 's/^.\{6\}\(.\{13\}\)\(..\).*/\1-\2/' file.txt

진주

perl -pe 's/^.{6}(.{13})(..).*/$1-$2/' file.txt

답변2

고정된 열, 고정된 크기, 고정된 문자 위치를 기반으로 한 절단 방식:

$ cut --output-delimiter='-' -c7-19,20-21 file.txt
# display from char 7 up to 19, then print output delimiter, then display from char 20 up to char 21.

쿵쿵거리는 솔루션:

$ while IFS= read -r line;do line="${line:6:13}-${line:14:2}";echo $line;done<file.txt

문자 대신 필드 기반 솔루션:

while IFS= read -r line;do 
  line=$(cut -d' ' -f5- <<<"$line") #with space delimiter get field 5 up to the end
  line=$(cut -d- -f1-4 <<<"$line") #with delimiter="-" get field 1 up to 4
  line=$(sed "s/${line: -2}/-${line: -2}/g" <<<"$line") #insert a dash before last two characters
  echo "$line"
done<file

프로세스 대체가 포함된 한 줄의 코드:

$ sed 's/..$/-\0/g' <(cut -d- -f1-4 <(cut -d" " -f5- file.txt)) #use >newfile at the end to send the results to a new file

# 1모든 경우에 결과는 입력 파일을 고려하여 예상한 대로입니다(각 줄의 시작 부분 포함).

답변3

개인적으로 가장 좋아하는 것은 awk 솔루션이지만 여기에 또 다른 접근 방식이 있습니다.

cat FILE_NAME | tr -s ' ' | cut -d' ' -f3 | cut -b 1-13

관련 정보